【问题标题】:Next-auth custom auth provider with custom backend具有自定义后端的 Next-auth 自定义身份验证提供程序
【发布时间】: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 >
  )
}

有什么想法吗?

【问题讨论】:

    标签: javascript reactjs authentication next.js next-auth


    【解决方案1】:

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

    【讨论】:

    • 请详细解释你的答案。将来可能会对某人有所帮助!
    • 如果您能提供一个完整的工作代码示例,那就太好了。另外,您如何在成功登录后发出的每个 API 请求中包含从后端获得的令牌?
    猜你喜欢
    • 1970-01-01
    • 2012-11-09
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多