Oauth
今天Any给我讲了一下助手的Oauth的逻辑,突然对Oauth茅塞顿开
先白嫖一张图片过来
现在我们模拟一个场景,就是我们使用助手作为授权服务器来访问上课啦这个第三方应用
- 上课啦 先会将 redirectId state(随机生成) clientId(事先在助手服务器上有绑定) 发给助手服务器
- 助手 收到 这些参数后就会随机生成一个 code 然后重定向到 hduhelp.com/active 页面
- 在 hduhelp.com/active 页面我们主要用于激活这个授权码,就是会跳出一个登录页面,让用户登录,生成一个token,然后将token-code-state 绑定在一起存到数据库中
- 然后因为 Oauth2.0 的具体格式原因,助手会 query.add(state) \ query.add(code) \ clientId \ c.redirect(redirectId) 到上课啦的重定向页面,上课啦会校验 state 分析途中有没有被修改
- 然后 上课啦 会把 code + state + clientId + redirectUrl 重新发给助手
- 助手通过刚才的数据库中查询 code 是否匹配来返回 token,同时将刚才存储的code删除,一般这个code是短暂的
- 上课啦拿到token后,显示登录成功,也会生成一个新的token,这个token会将这个token和用户的uid绑定在一起
这里有些细节其实可以更清楚一点
- client_id 其实会 事先在助手服务器上注册记录
redirect_uri
:上课啦的重定向URI,用户授权后将重定向到此地址- 一般还会加一个 scope 字段来表示 请求的权限范围(可选)
state
是随机生成的状态值,用于防止CSRF攻击
下面是我的草图:
下面是助手实际的Oauth过程(默认已登录):
1 | func TokenLoginHandler(c *gin.Context) { |
顺便提供一张 any 的疯狂草图:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Echin の 博客!