NextAuth.js 令牌长度和 Cognito 的问题 [英] Problem whit NextAuth.js token length and Cognito
本文介绍了NextAuth.js 令牌长度和 Cognito 的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试使用 NextAuth.js 和 Cognito 在我的 Next.js 应用程序中实现身份验证.这是我的问题:当调用 jwt 回调时,我想在会话 3 中存储令牌和其他东西,但令牌最大长度为 4096 字节.我该如何实施?提前致谢!
I'm trying to implement authentication in my Next.js app using NextAuth.js and Cognito. Here's my problem: when the jwt callback is called I want to store in the session 3 tokens and other stuff but the token max length is 4096 bytes. How Can I implement this? Thanks in advance!
providers: [
Providers.Cognito({
clientId: process.env.COGNITO_CLIENT_ID,
domain: process.env.COGNITO_DOMAIN,
idToken: true,
scope: 'openid profile email aws.cognito.signin.user.admin',
}),
],
callbacks: {
async jwt(token, user, account, profile) {
// Initial sign in
if (account && user) {
// Max 4096 bytes
return {
accessToken: account.accessToken,
idToken: account.idToken, // Too long
accessTokenExpires: Date.now() + account.expires_in! * 1000,
refreshToken: account.refresh_token,
user, // Too long
profile, // Too long
};
}
// Return previous token if the access token has not expired yet
if (Date.now() < (token.accessTokenExpires as number)) {
return token;
}
// Access token has expired, try to update it
return refreshAccessToken(token);
},
async session(session, token) {
const sessionToken = session;
sessionToken.accessToken = token.accessToken;
sessionToken.idToken = token.idToken;
sessionToken.profile = token.profile;
return sessionToken;
},
},
});
推荐答案
我通过导出一个需要两个参数的函数来解决:req
(请求)和 res
(响应).这些参数允许我设置和获取我想要的所有 cookie.这是我的代码:
I solved by export a function which require two parameters: req
(the request) and res
(the response). These params allow me to set and get all the cookies I want.
This is my code:
const getOptions = (req, res) => ({
providers: [
Providers.Cognito({
clientId: process.env.COGNITO_CLIENT_ID,
domain: process.env.COGNITO_DOMAIN,
idToken: true,
scope: 'openid profile email aws.cognito.signin.user.admin',
}),
],
callbacks: {
async jwt(token, user, account) {
// Initial sign in
if (account && user) {
const cookies = new Cookies(req, res);
cookies.set('userId', user.id);
cookies.set('idToken', account.idToken);
// Max 4096 bytes
return {
accessToken: account.accessToken,
accessTokenExpires: Date.now() + account.expires_in! * 1000,
refreshToken: account.refresh_token,
};
}
// Return previous token if the access token has not expired yet
if (Date.now() < (token.accessTokenExpires as number)) {
return token;
}
// Access token has expired, try to update it
return refreshAccessToken(token);
},
async session(session, token) {
const cookies = new Cookies(req, res);
const userId = cookies.get('userId');
const idToken = cookies.get('idToken');
const sessionToken = session;
sessionToken.accessToken = token.accessToken;
sessionToken.idToken = idToken;
sessionToken.userId = userId;
return sessionToken;
},
},
});
export default (req, res) => NextAuth(req, res, getOptions(req, res));
这篇关于NextAuth.js 令牌长度和 Cognito 的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文