Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support oauth2 #470

Closed
HuangWeiCen opened this issue Apr 24, 2022 · 0 comments
Closed

support oauth2 #470

HuangWeiCen opened this issue Apr 24, 2022 · 0 comments
Assignees
Labels
ee the problem for Enterprise Edition feature ui this issue is is related to the FE verified the issue all pr is verified
Milestone

Comments

@HuangWeiCen
Copy link
Contributor

HuangWeiCen commented Apr 24, 2022

原始需求

企业版支持oauth2登录

开发方案

用户使用流程

oauth2用户使用流程

平台运行逻辑

oauth2平台逻辑

前端方案

登录流程

  1. 用户进入登陆界面
  2. 前端向后端请求oauth2登录配置, 包含oauth2是否开启以及按钮文字等
  3. 前端判断如果oauth2开启则显示oauth2登录按钮, 未开启则隐藏(企业版后端永远返回false)
  4. 用户点击按钮, 调用后端指定接口, 后端会通过302请求重定向网址到第三方平台登录
  5. 用户登录完第三方平台会调用回SQLE指定接口,SQLE接口校验完如果登录成功则会通过302跳转到绑定用户界面(http://ip:port/user/bind)(下图)
    image
  6. (5)中重定向后的地址会带着用户是否存在, sqle用户token和第三方平台用户ID, 前端根据用户是否存在判断直接跳转到平台还是让用户停留在(5)中绑定用户名密码
  7. 绑定接口成功会返回用户token, 前端使用此token跳转到平台功能页面

http://ip:port/user/bind参数定义

因为这个地址实际上是个前端地址, 由后端控制跳转到此地址, 所以不使用swagger定义, 仅采用约定的方式再此处定义参数
参数均为get请求参数, 请求方式为get请求

参数名 参数中文名 参数类型 参数解释
user_exist 用户是否存在 bool sqle中是否存在此用户, 没有则应当停留在用户绑定界面要求用户绑定
sqle_token sqle用户token string 如果sqle中存在此用户将会直接将用户token返回, 如果没绑定用户此项为空
oauth2_token 第三方平台token string 用户在第三方平台登录成功后sqle会将从第三方平台获取到的token一同返回, 用于绑定sqle用户时使用
error 错误信息 string 如果oauth2登录过程出现错误, 如解析用户ID失败等, 将在此处记录错误信息,没错误此项为空

配置oauth2

  1. 系统设置界面新增一项用于设置oauth2相关配置, 字段解释详见后端方案
  2. 社区版此项显示提示信息, 不允许用户设置也不展示配置内容

后端方案

系统配置相关

新增接口

  1. /v1/configurations/oauth2 [get] 获取配置
  2. /v1/configurations/oauth2 [patch] 更新配置
  3. /v1/configurations/oauth2/tips [get] 获取oauth2基本信息, 此接口无需登录即可访问
  4. 暂不提供测试接口

字段说明

字段名 字段中文名 字段类型 默认值 字段说明
enable_oauth2 是否启用oauth2 bool false 开启后才会启用oauth2登录
client_id 应用ID string / 应用的唯一标识, 从要对接的平台申请 , 在OAuth2.0认证过程中,appid的值即为oauth_consumer_key的值。
client_key 应用密钥 string / appid对应的密钥,访问用户资源时用来验证应用的合法性。在OAuth2.0认证过程中,appkey的值即为oauth_consumer_secret的值。
client_host 外部访问sqle的地址 string / 格式为 http(s)://ip:port
server_auth_url oauth2登录授权页面地址 string / 格式类似于 http(s)://ip:port/xxx
server_token_url oauth2 access_token 获取地址 string / 格式类似于 http(s)://ip:port/xxx
server_user_id_url oauth2 user id 获取地址 string / 格式类似于 http(s)://ip:port/xxx
scopes 请求资源范围 []string / 此范围由验证服务器定义
access_token_tag access_token放置位置 string / sqle会在获取用户ID时将access_token放在这个key对应的value中, 此参数会作为get请求的参数发送给用户ID获取地址
user_id_tag 用户ID保存位置 string / sqle会尝试使用此key从第三方平台的响应中解析出用户ID,用户ID应当为唯一ID
login_tip 登录按钮文字 string "使用第三方账户登录" oauth2登录按钮文字

登录校验

新增接口

  1. /v1/oauth2/link [get] 用户点击第三方登录后前端访问此接口, 由后端控制跳转到第三方平台登录
  2. /v1/oauth2/callback [get] sqle提供给oauth2验证平台的回调接口
  3. /v1/oauth2/user/bind [post] 将第三方用户和sqle用户进行绑定, 不存在的sqle用户将会创建

后端流程

  1. 前端请求 /v1/oauth2/link [get] ,后端拼接出目标地址并控制浏览器跳转
  2. 用户在第三方登录完成后第三方会回调 /v1/oauth2/callback [get] , callback解析出access_token
  3. 通过access_token获取到第三方平台中的用户ID
  4. 检查此用户ID是否已经绑定了sqle用户,如果绑定了则生成对应sqle token
  5. 后端控制前端跳转到绑定用户界面(http://ip:port/user/bind)
  6. 如果前端向/v1/oauth2/user/bind [get]发送请求则校验并绑定对应用户, 如果用户不存在则创建, 然后返回sqle token
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
ee the problem for Enterprise Edition feature ui this issue is is related to the FE verified the issue all pr is verified
Projects
None yet
Development

No branches or pull requests

3 participants