reactjs 如何使用Next-auth同时存储多个会话

flseospp  于 2022-12-03  发布在  React
关注(0)|答案(1)|浏览(227)

我正在开发一个类似于Zappier的集成工具。我想使用Next-auth连接到一个或多个应用程序并保存它们的访问令牌。但是,Next-auth一次只允许一个会话。我如何使用Next-auth一次存储多个会话?

export const authOptions = {
  // Configure one or more authentication providers
  secret: 'tsfsdf',
  providers: [
    GoogleProvider({
      clientId: process.env.GOOGLE_CLIENT_ID,
      clientSecret: process.env.GOOGLE_CLIENT_SECRET,
      authorization: {
        params: {
          scope: 'openid https://www.googleapis.com/auth/gmail.compose https://www.googleapis.com/auth/gmail.modify'
        }
      }
    }),
    {
      clientId: process.env.QUICK_BOOKS_CLIENT_ID,
      clientSecret: process.env.QUICK_BOOKS_CLIENT_SECRET,
      id: 'quickbooks',
      name: 'QuickBooks',
      type: 'oauth',
      wellKnown: 'https://developer.api.intuit.com/.well-known/openid_sandbox_configuration',
      authorization: { params: { scope: 'com.intuit.quickbooks.accounting openid profile email phone address' } },
      idToken: true,
      checks: ['pkce', 'state'],
      profile(profile) {
        console.log(profile, 'profile')
        return {
          id: profile.sub,
          name: profile.name,
          email: profile.email,
          image: profile.picture
        }
      }
    }
    // ...add more providers here
  ],
  callbacks: {
    async session({ session, token, user }) {
      session.user.id = token.id
      session.accessToken = token.accessToken
      return session
    },
    async jwt({ token, user, account, profile, isNewUser }) {
      if (user) {
        token.id = user.id
      }
      if (account) {
        token.accessToken = account.access_token
      }
      return token
    }
  }
}
ryevplcw

ryevplcw1#

要做到这一点,您只需向authOptions对象中的providers数组添加更多的对象,每个providers对象都应该有自己的配置,如clientId、clientSecret和authorization参数。
当用户通过提供程序进行身份验证时,将使用包含该提供程序的访问标记的标记对象调用回调对象中的会话回调函数。可以使用此访问标记代表用户发出API请求。
要一次保存多个会话,可以将访问令牌保存在数据库或会话存储系统(如Redis)中。然后,当用户通过新的提供者进行身份验证时,可以检索现有的会话,并将新的访问令牌添加到会话列表中。
下面是一个如何使用数据库实现此功能的示例:

// In the session callback function
async session({ session, token, user }) {
  // Check if the user already has any sessions stored in the database
  const existingSessions = await db.getUserSessions(user.id);

  // Add the new access token to the list of sessions
  existingSessions.push({ provider: token.provider, accessToken: token.accessToken });

  // Save the updated list of sessions to the database
  await db.saveUserSessions(user.id, existingSessions);

  return session;
}

这只是一个例子,说明了如何使用Next-auth实现多个会话。可能还有其他方法可以实现这一点。

相关问题