我在我的Next.js应用中使用Auth0进行身份验证,并使用Express.js API后端。在我的本地环境中一切正常,但当我将应用部署到生产环境时,我遇到了身份验证问题。
当我在本地环境中向Auth0请求访问令牌时,我会收到一个JWT(JSON Web令牌),它可以正常工作。但是,当我在生产环境中向Auth0请求访问令牌时,我会收到一个JWE(JSON Web加密)令牌。这会导致身份验证问题,因为我的后端需要一个JWT令牌。
我已经仔细检查了我的环境变量和Auth0设置,但我找不到造成这种差异的原因。我如何确保Auth0在我的本地和生产环境中生成JWT访问令牌?
我的jwt在后台检查:
const { auth } = require('express-oauth2-jwt-bearer');
const jwtCheck = auth({
audience: process.env.AUTH0_AUDIENCE,
issuerBaseURL: process.env.AUTH0_ISSUER_BASE_URL,
tokenSigningAlg: 'RS256'
});
我与前面的auth0的连接:
const auth0 = initAuth0({
scope: 'openid profile email offline_access',
audience: process.env.AUTH0_AUDIENCE,
issuerBaseURL: process.env.AUTH0_ISSUER_BASE_URL,
baseURL: process.env.AUTH0_BASE_URL,
clientID: process.env.AUTH0_CLIENT_ID,
clientSecret: process.env.AUTH0_CLIENT_SECRET,
secret: process.env.AUTH0_SECRET
});
任何帮助将不胜感激。谢谢
我已经在两个环境中验证了我的env变量,一切似乎都很好(至少对我来说)。
**更新:**我注意到我的本地env中有一些有趣的东西。我已经将我的initAuth0中的所有process.env替换为我的.env文件的实际值。并且我删除了我的.env文件。auth连接已经建立,但我收到的是JWE而不是JWT。这是我的生产问题。
const auth0 = initAuth0({
scope: 'openid profile email offline_access',
audience: "***",
issuerBaseURL: "***",
baseURL: "http://localhost:3000",
clientID: "***",
clientSecret: "***",
secret: "****"
});
但是如果我在我的.env文件中添加AUTH0_AUDIENCE="***”,并将所有值保留在initAuth0中(没有process.env,只有实际值),我会得到正确的JWT,一切正常。
看起来当尝试使用getAccessToken()检索JWT时,AUTH0_AUDIENCE会自动访问,因此Auth0需要。同样,这在本地工作,但在生产环境中不工作。
2条答案
按热度按时间evrscar21#
在Nextjs中,由于
env
文件的安全性,如果你想在客户端获得一个env
,你必须像这样将NEXT_PUBLIC
放在每个env名称的第一位:必须使用
NEXT_PUBLIC_AUTH0_AUDIENCE
而不是AUTH0_AUDIENCE
xxhby3vn2#
好吧,我已经找到了解决这个问题的方法,我将我的应用程序部署到Vercel而不是AWS Amplify。我没有更改配置中的任何内容,它工作了。
我真的很好奇,如果有人知道我在AWS上做错了什么。