我正在开发一个类似于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
}
}
}
1条答案
按热度按时间ryevplcw1#
要做到这一点,您只需向authOptions对象中的providers数组添加更多的对象,每个providers对象都应该有自己的配置,如clientId、clientSecret和authorization参数。
当用户通过提供程序进行身份验证时,将使用包含该提供程序的访问标记的标记对象调用回调对象中的会话回调函数。可以使用此访问标记代表用户发出API请求。
要一次保存多个会话,可以将访问令牌保存在数据库或会话存储系统(如Redis)中。然后,当用户通过新的提供者进行身份验证时,可以检索现有的会话,并将新的访问令牌添加到会话列表中。
下面是一个如何使用数据库实现此功能的示例:
这只是一个例子,说明了如何使用Next-auth实现多个会话。可能还有其他方法可以实现这一点。