NextAuth.js 令牌长度和 Cognito 的问题 [英] Problem whit NextAuth.js token length and Cognito

查看:17
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆