具有自定义后端的 Next-auth 自定义身份验证提供程序

Posted

技术标签:

【中文标题】具有自定义后端的 Next-auth 自定义身份验证提供程序【英文标题】:Next-auth custom auth provider with custom backend 【发布时间】:2022-01-07 12:00:52 【问题描述】:

auth 身份验证,但我遇到了会话问题

我的下一个身份验证版本是 4.0.0-beta.4(也尝试了 beta.7,结果相同)

我有自己的 JWT 令牌后端,它接受用户名和密码。并返回一个带有 accesstoken、refreshtoken、expiretime 和 resfresh-time 的对象

所以我尝试使用该后端通过 next-auth 处理会话状态。 我设法设置cookie“next-auth.session-token”。但是当我尝试获取会话时,会话总是未定义。

而且我的 Firefox 浏览器中没有任何会话。

const options = 
    providers: [
        Credentials(
            name: "Credentials",
            credentials: 
                username: 
                    label: "Username",
                    type: "text"
                ,
                password: 
                    label: "Password",
                    type: "password"
                
            ,
            session: 
                jwt: true,
                maxAge: 30 * 24 * 60 * 60 // the session will last 30 days
            ,
            authorize: async (credentials) => 
                const tokenUrl = "http://192.168.0.8:8081/api/auth/token"
                const token = await fetch(tokenUrl, 
                    method: "POST",
                    mode: "cors",
                    headers: 
                        "Content-Type": "application/json"
                    ,
                    body: JSON.stringify(
                        username: credentials.username,
                        password: credentials.password
                    )
                )
                    .then(res => res.json())
                console.log("token: ", token)
                if (token) 
                    const userUrl = "http://192.168.0.8:8081/admin/user/username/" + credentials.username;
                    const user = await fetch(userUrl, 
                        method: "GET",
                        mode: "cors",
                        headers: 
                            "Content-Type": "application/json",
                            "Authorization": "Bearer " + token.access_token
                        
                    ).then(res => res.json())

                    return 
                        token,
                        user
                    ;
                 else 
                    return null;
                
            
        ),
    ],
    session: 
        jwt: true
    ,
    pages: 
        signIn: "/login",
    ,
    secret: "TEST",
    callbacks: 
        async jwt( token, user ) 
            // Initial call
            if (user) 
                return 
                    accessToken: user.token.access_token,
                    accessTokenExpires: Date.now() + user.token.expire_time * 1000,
                    refreshToken: user.token.refresh_token,
                    user: user.user,
                
            
            // Subsequent calls
            return token;
        ,
        async session(session) 
            session.name = session.token.user.fullName
            session.accessToken = session.token.accessToken
            session.refreshToken = session.token.refreshToken
            return session;
        
    

这里我正在尝试登录后获取会话

export default function Home() 

  const  data: session  = getSession();

  console.log("session: ", session)

  return (


    < div >
    </div >
  )

有什么想法吗?

【问题讨论】:

【参考方案1】:

我的问题是我使用了错误的方法。我需要使用 useSession 方法而不是 getSession。然后它起作用了。 ?

【讨论】:

请详细解释你的答案。将来可能会对某人有所帮助! 如果您能提供一个完整的工作代码示例,那就太好了。另外,您如何在成功登录后发出的每个 API 请求中包含从后端获得的令牌?

以上是关于具有自定义后端的 Next-auth 自定义身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章

登录 NEXT-AUTH 后重定向到自定义 URL

为啥在页面转换时不调用 next-auth jwt 回调?

具有自定义生命周期的身份服务器 4 访问令牌

如何使用 Angular + Spring + JSON 自定义登录/身份验证

Azure 应用服务:自定义身份验证和社交提供程序

移动客户端的asp.net Web Api自定义身份验证要求