对于NextAuth.js,如何在不注销和再次登录的情况下更新会话对象中的值?
例如,一旦用户登录,我就使用存储在会话中的URL来显示用户的化身。
我还提供用户更改他的化身,所以我希望session.user.image
能够更新并保持化身的新路径。我将所有数据存储在MongoDB中。我如何实现这一点?目前唯一的解决方案是要求用户注销并重新登录,但这听起来不像是一个我可以接受的解决方案:)
我的第一个想法是,一旦用户更新了他的化身,就更新这个会话对象,但我不知道如何做到这一点。
import React from 'react'
import { signIn, signOut, useSession } from 'next-auth/client'
export default function Page() {
const [ session, loading ] = useSession()
return <>
{session && <>
<img src={session.user.image} />
<button onClick={signOut}>Sign out</button>
</>}
</>
}
4条答案
按热度按时间ryevplcw1#
你能做的最好的事情是在发送会话数据到客户端之前修改数据。通过使用next-auth会话回调,我们可以很容易地做到这一点。
swvgeqrz2#
一种可能的解决方案是手动更新用户对象,查看下面的链接了解next-auth的回调函数是如何工作的https://next-auth.js.org/configuration/callbacks-一种可能的方法是在jwt()/session()回调函数中更新用户,并自行调整用户信息。
到目前为止,我还没有找到一个函数来触发与数据库相关的用户对象的自动更新。
qqrboqgw3#
在我的情况下,我在我的网站上做apment之后,我想修改会话时,我做的会话。用户。订阅=真;它的作品,如果我不重新加载页面,当我重新加载页面,我得到previos值订阅=假,现在根据u,我可以n=修改会话通过用户在回调,但我怎么能知道,付款已在这些回调,我们被困在这一刻.
如果我注销并重新登录,会话中订阅者值将自动更新
fcipmucu4#
通常不建议在提供程序的配置之外修改会话,因为这可能导致安全问题,如篡改用户数据。
如果将
next-auth
会话存储在数据库中(即session.strategy = "database"
),那么最好的选择可能是直接在数据库中更新会话。但是,如果您将会话存储在
next-auth
的加密JWT中,那么重新验证用户并发布一个具有更新信息的新JWT可能是最安全的方法。也就是说,您可以通过以下方式直接更新JWT标记:
1.从“next-auth.session-token”cookie中获取当前令牌值
1.更新令牌
1.基于更新的令牌和旧值(如过期、发布时间、...)创建新的加密JWT
1.将“next-auth.session-token”cookie值替换为新的内标识
下面是一个示例,它看起来是这样的:
上面的代码使用
next-auth
的内部encode
方法,该方法基于derived encryption key创建加密的JWT,而不是使用普通的NEXTAUTH_SECRET
值进行加密。由于
next-auth
使用HttpOnly
cookie,因此此代码显然仅在API路由中工作,出于安全考虑,显然不应尝试使其在客户端工作。