JustAuth 与现有用户系统整合
优质
小牛编辑
127浏览
2023-12-01
发现问题
之前在群里经常会看到小伙伴有以下几点疑问:
- JustAuth 如何与现有用户系统整合?
- JustAuth 如何实现用户绑定?
我就此需求,整理了一份 JustAuth 与现有用户系统整合逻辑图
JustAuth 与用户系统整合流程图
数据库表结构(参考)
以下为 第三方登录 + 本地用户系统 的数据库表结构(仅供参考)
用户表(user)
字段 | 类型 | 释义 | NULL | 备注 |
---|---|---|---|---|
id | int | 主键 | false | |
username | varchar | 用户名 | false | |
password | varchar | 密码 | true | 选择使用第三方用户登录时不存在密码,除非进行了用户绑定 |
nickname | varchar | 昵称 | true | |
gender | varchar | 性别 | true | |
avatar | varchar | 头像 | true | |
blog | varchar | 个人地址 | true | |
company | varchar | 公司名 | true | |
location | varchar | 地址 | true | |
varchar | 邮箱 | true |
社会化用户表(social_user)
字段 | 类型 | 释义 | NULL | 备注 |
---|---|---|---|---|
id | int | 主键 | false | |
uuid | varchar | 第三方系统的唯一ID | false | 详细解释请参考:名词解释 |
source | varchar | 第三方用户来源 | false | GITHUB、GITEE、QQ,更多请参考:AuthDefaultSource.java (opens new window) |
access_token | varchar | 用户的授权令牌 | false | |
expire_in | int | 第三方用户的授权令牌的有效期 | true | 部分平台可能没有 |
refresh_token | varchar | 刷新令牌 | true | 部分平台可能没有 |
open_id | varchar | 第三方用户的 open id | true | 部分平台可能没有 |
uid | varchar | 第三方用户的 ID | true | 部分平台可能没有 |
access_code | varchar | 个别平台的授权信息 | true | 部分平台可能没有 |
union_id | varchar | 第三方用户的 union id | true | 部分平台可能没有 |
scope | varchar | 第三方用户授予的权限 | true | 部分平台可能没有 |
token_type | varchar | 个别平台的授权信息 | true | 部分平台可能没有 |
id_token | varchar | id token | true | 部分平台可能没有 |
mac_algorithm | varchar | 小米平台用户的附带属性 | true | 部分平台可能没有 |
mac_key | varchar | 小米平台用户的附带属性 | true | 部分平台可能没有 |
code | varchar | 用户的授权code | true | 部分平台可能没有 |
oauth_token | varchar | Twitter平台用户的附带属性 | true | 部分平台可能没有 |
oauth_token_secret | varchar | Twitter平台用户的附带属性 | true | 部分平台可能没有 |
社会化用户 & 系统用户关系表(social_user_auth)
字段 | 类型 | 释义 | NULL | 备注 |
---|---|---|---|---|
id | int | 主键 | false | |
user_id | varchar | 系统用户ID | false | |
social_user_id | varchar | 社会化用户ID | false | 数据库主键(非第三方用户的ID) |
注意
建议通过uuid
+ source
的方式唯一确定一个用户,这样可以解决用户身份归属的问题。因为 单个用户ID 在某一平台中是唯一的,但不能保证在所有平台中都是唯一的。
相关 SQL
操作的伪代码
获取第三方平台 GITHUB
用户(UUID = xxxxxxx
)的 SQL
语句伪代码:
SELECT
su.*
FROM
`social_user` su
WHERE
su.uuid = 'xxxxxxx'
AND su.source = 'GITHUB'
查询系统用户(ID = 1
)是否绑定了 GITHUB
平台账号的 SQL
语句伪代码:
SELECT
count(1)
FROM
`social_user_auth` sua
INNER JOIN `social_user` su ON sua.social_user_id = su.id
WHERE
sua.user_id = '1'
AND su.source = 'GITHUB'
解绑 GITHUB
平台的绑定账号
DELETE FROM `social_user_auth` sua WHERE sua.social_user_id = '1' AND sua.user_id = '1'