繁体   English   中英

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

[英]Next-auth custom auth provider with custom backend

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

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

我有自己的 JWT 令牌后端,它需要用户名和密码。 并返回带有 accesstoken、refreshtoken、expiretime 和 resfresh-time 的 object

所以我试图使用该后端来处理 session state 和下一个身份验证。 我设法设置cookie“next-auth.session-token”。 但是当我尝试获取会话时,session 总是未定义。

而且我的 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;
        }
    }
}

在这里,我在登录后尝试获取 session

export default function Home() {

  const { data: session } = getSession();

  console.log("session: ", session)

  return (


    < div >
    </div >
  )
}

有任何想法吗?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM