[RFC] 089 - 支持 OAuth2.0 6749 Refresh Token & Database Session #6545
cy948
started this conversation in
RFC | 特性开发
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
背景
OAuth 授权支持
PR#1143 的合并标志 LobeChat 正式接入 OAuth,为用户资源提供保护。在当前的实现中,LobeChat 用户中使用 Github 登陆时,各个服务承担的角色:
https://github.com/login/oauth
)。https://api.github.com/user
),验证令牌后返回用户信息。Figure 1: Abstract Protocol Flow
当前 OAuth 接入的优缺点
从上述过程中可以发现,授权服务器 (Authorization Server)完成授权后,后续的会话、用户管理都由 LobeChat 进行管理。这种实现:
但因当前的 OAuth 实现,实际上只停留在 Social Connection(社交连接)的层面。 Social Connection 通常指通过用户的社交媒体账号(如 Google、Facebook、GitHub 等)实现第三方应用登录或身份绑定的机制。其核心目标是简化用户注册/登录流程,提升用户体验,同时借助已有社交平台的信任体系。本质上还是一种登录、身份绑定机制,在社区同学的使用过程中,出现了这些实际问题:
归根到底,这些问题产生的原因是LobeChat没有定期向Authorization Server询问Client的可用状态。在后续的补充实现 PR#3774 中,我们通过对资源服务器 (Resource Server)
Webhook
支持减缓了“用户数据存储分散”的问题,但剩下问题的解决需要以下功能的支持,也就是本 RFC 提议的 Refresh Token & Database Session 支持。Refresh Token 支持
Refresh Token 流程
在 PR#6209 的实现中,以用户使用 Auth0 登录,并向 Auth0 请求 Refresh Token 的过程:
Refresh Token 支持意义及挑战
实现
方案
针对以上问题,提出一种能满足Lobe及Auth服务对用户进行管理的方案:
Token Rotation
):在Lobe中,在Auth服务授权的访问令牌(access_token)进行刷新,以获取当前用户在 Auth 服务的授权状态:正常、禁用:Webhook
,database session
):Auth服务会在“禁用”用户时,通过webhook向lobe发送事件,Lobe可在收到事件后,清除目标用户的会话,强制用户重新登录。依据 AuthJS 文档建议的实现,在用户请求 session 时,前往 Auth 服务刷新令牌,使 Lobe 用户的登录状态受到 Auth 服务约束,实现以下功能:
进度
工程踩坑记录
next-auth
会多次并发调用auth
,导致该实现需要并发刷新 token (并发调用[G]->[H]
)。而 Casdoor 是RFC6749中推荐的 refresh token 只能使用1次的实现,因而暂时无法接入。待 AuthJS 的全局锁实现后可以接入。Beta Was this translation helpful? Give feedback.
All reactions