记一次做 OAuth2 应用时懵逼的经历
正文
这两天在弄授权登录,使用的是 Github 的服务,授权登录的流程很多文章都介绍过,就写个大概吧。
- 先是打开授权登录页面。
- 完成 Github 登录后页面会跳转到 Github 的认证接口。
- 完成认证后会跳转到开发者预留的后端 callback 接口,跳转时会带有 code 参数。
- 后端根据 Github 传来的 code(也可能是用户篡改后的),通过 Github 的另一个接口 codeVerify 去验证真实性。
- codeVerify 接口校验成功后会返回 token,后端使用 token 去访问 access 接口,拿取用户的相关信息。
- 到这一步,验证流程就结束了。
我当时先根据这个流程做出了 callback 接口,为了方便调试,将用户信息直接在 response body 中展示了出来,当时觉得没问题。
之后在前端页面中加入了登录按钮,跳转授权登录页面,在完成 Github 登录后,页面自然也就显示出了我的相关信息,到这一步也没什么问题。
那么现在问题来了,如何让前端知道用户已经登录了呢?当时摸索了半天,才解决了这个问题,实际上 callback 接口那少了一步,最后不应该将用户信息显示出来,不只是为了安全,最后一步应该是重定向。
比如,后端在验证成功后,签发一个 token,将 token 通过 url 参数以重定向的形式回传给前端,前端可以顺势显示一个”已登录成功”,再回到首页。
题外话
Github 授权登录的接口我其实在几年前就已经实现过了,流程图也看了好几回,但是没有把这个技术完整地在前后端实现一遍,事实上实现起来才会发现一些隐藏的问题,看理论还不一定能意识到。