第一步:用户点击第三方登录按钮,前端向后端发送一个请求,后端生成防 CSRF 攻击的 state ,连同授权地址一块返回,假设是 https://github.com/authorize/?state=abcdefg
第二步:前端获取到返回的授权地址,解析出 state ,存在 Cookie 中(或者存 LocalStorage ,但不知道通常的做法是存哪里?),将页面跳转至授权地址,地址中的 state 会在后续所有步骤中透传。
第三步:用户完成授权,授权方将页面重定向到某个地址,这个地址是前端路由,前端在这个路由里解析相关参数,将授权 code ,透传的 state ,连同 Cookie 中存储的 state 发送给后端登录接口。
第四步:后端接收到请求后,首先校验 Cookie 中的 state 和透传的 state 是否匹配,确保没有 CSRF 攻击。然后用 code 交换授权的用户信息,验证成功后即可登录这个用户。
几个疑问:
- 前后端分离的项目,授权流程是这样的吗?尤其是授权后回调地址,是不是必须得是前端的路由才行?
- 防止 CSRF 攻击的 state ,处理方式是我说的这样吗?常规是怎么做的呢?
