JWT_SESSION_ERROR in next auth with next.js



在本地开发中,签到工作正常,但是下面的错误是由next-auth抛出的,而从我们的自定义oauth提供程序返回生产构建在开发url如https://dev-app.xyz.com

NEXTAUTH_SECRET和NEXTAUTH_URL环境变量也按此设置https://next-auth.js.org/deployment

'authError {代码:"JWT_SESSION_ERROR",元数据:{代码:"ERR_JWE_DECRYPTION_FAILED",名称:"JWEDecryptionFailed",消息:'解密操作失败',

}} '

pacakge版本'"dependencies" {

"@mui/icons-material": "^5.10.14",
"@mui/x-data-grid": "^5.17.14",
"@sentry/nextjs": "^7.23.0",
"@reduxjs/toolkit": "^1.9.1",
"applicationinsights": "^2.3.6",
"axios": "^1.2.0",
"moment": "^2.29.4",
"moment-timezone": "^0.5.38",
"net": "^1.0.2",
"next": "13.0.4",
"next-auth": "^4.18.4",
"nextjs-redirect": "^6.0.1",
"react": "18.2.0",
"react-dom": "18.2.0",
"react-intl": "^6.2.1",
"react-redux": "^8.0.5",
"react-test-renderer": "^18.2.0",
"tls": "^0.0.1",
"v8": "^0.1.0"

},'

[…nextauth]。t

export default async function auth(req: NextApiRequest, res: NextApiResponse) {
if (!config?.payload) {
try {
const response = await fetch('url to fetch config dyamic');
config = await response.json();

} catch (error) {
if (error) {

}
}
}
try {
return await NextAuth(req, res, {
providers: [
{
id: appConst.OAUTH_ID,
name: 'Demo',
type: 'oauth',
checks: ['pkce', 'state'],
idToken: true,
wellKnown: `${config.payload.idtAuthorityUrl}${apiUrls.IDT_WELLKNOWN}`,
authorization: {
params: {
scope: config.payload.webAppIdtClientScope,
},
},
clientId: config.payload.webAppIdtClientId,
profile(profile) {
return {
id: 1,
...profile,
};
},
clientSecret: config.payload.webAppIdtClientSecret,
},
],
pages: {
signIn: apiUrls.AUTH_ERROR,
},
secret: process.env.NEXTAUTH_SECRET,
debug: false,
session: {
strategy: 'jwt',
},
jwt: {
secret: process.env.NEXTAUTH_SECRET
},
useSecureCookies: true,// using false while local development
logger: {
error(code, metadata) {

// eslint-disable-next-line no-console
console.log('authError', { code, metadata });

},
},
callbacks: {
async jwt({ token, account }) {
if (account) {
token.accessToken = account.access_token;
token.accessTokenExpire = account.expires_at
? account.expires_at * 1000
: 0;
token.refreshToken = account?.refresh_token;
token.id_token = account?.id_token;
token.accessTokenIssuedAt = Date.now();
}
//  return token if not Access token expired
if (
token.accessTokenExpire &&
Date.now() < token.accessTokenExpire
) {
return token;
}
//  Access token has expired, try to update it
return await getAccessToken(token, config.payload);
},
// eslint-disable-next-line require-await
async session({ session, user, token }) {
if (token && typeof token.accessTokenExpire === 'number' && typeof token.accessTokenIssuedAt === 'number') {
const tempsession: any = session;
// session interval in seconds, It's accesstoken expire - 10 minutes
let interval = Math.round(((token.accessTokenExpire - token.accessTokenIssuedAt) - (60000 * 10)) / 1000);
if (interval < 300) {
interval = 2
}
tempsession.interval = interval;
return tempsession;
} else {
return session;
}
},
},
});
} catch (error) {
if (error) {

console.log('NextAuth', error);


}
}
}
<代码>

如果您遇到以下任何错误,请按照以下步骤操作,错误将像我的错误一样被修复。

secret: process.env.NEXTAUTH_SECRET,

步骤1生成秘密:

为此,在Linux下打开终端(在windows中打开Hyper或CMD)并输入:Ey7nTKnggBc0bRN8WUjyShw2qzOZ6KW4fUyqcKBePxY=这个命令的输出将是你的秘密,一个字符串,如:NEXTAUTH_SECRET='78zFZvyspgAIBXPKdA0AhFqcNWXX16/CEmBFOHU3iOg='

2-将此秘密放在环境变量中:

我建议您将这个秘密放在一个环境变量中。您可以使用.env文件(或.env.local)或直接使用下一个.config.js文件。这里我以我喜欢使用的next.config.js文件为例。在此文件中,添加值为NEXTAUTH_SECRET的行和您的secret。我在。env文件中的示例:Authorize

3-在下次认证配置中添加secret:

一旦将secret设置为环境变量,下一个授权者必须能够访问它。在NextJS下,可以通过进程在服务器端访问环境变量。env对象,我们感兴趣的是NEXTAUTH_SECRET属性,在你的应用程序中,转到/pages/api/auth/[…nextauth].js文件,并在与提供商和可能的回调相同的级别添加值:

PP_54-重新启动构建:

最后,记得运行一个新的npm run build,你就都设置好了🥳!

这可能是由于托管环境中web服务器级别的限制。假设你正在使用NodeJS和NextJS,并在Nginx或Apache后面运行web代理。

在OAuth三足过程中OAuth身份服务器发回数据。如果proxy-body-size,响应回调URL - body或header太大或太大,那么您的主机环境支持的可能会给出错误。

检查web服务器日志并调整proxy-buffer-sizefastcgi-buffer-size、CC_8等的配置,在Nginx的情况下,看看它是否有帮助。

建议基于它在本地工作,但在部署版本中显示错误

最新更新