关于前端的 OAuth2

记一次做 OAuth2 应用时懵逼的经历

正文

这两天在弄授权登录,使用的是 Github 的服务,授权登录的流程很多文章都介绍过,就写个大概吧。

  1. 先是打开授权登录页面。
  2. 完成 Github 登录后页面会跳转到 Github 的认证接口。
  3. 完成认证后会跳转到开发者预留的后端 callback 接口,跳转时会带有 code 参数。
  4. 后端根据 Github 传来的 code(也可能是用户篡改后的),通过 Github 的另一个接口 codeVerify 去验证真实性。
  5. codeVerify 接口校验成功后会返回 token,后端使用 token 去访问 access 接口,拿取用户的相关信息。
  6. 到这一步,验证流程就结束了。

我当时先根据这个流程做出了 callback 接口,为了方便调试,将用户信息直接在 response body 中展示了出来,当时觉得没问题。

之后在前端页面中加入了登录按钮,跳转授权登录页面,在完成 Github 登录后,页面自然也就显示出了我的相关信息,到这一步也没什么问题。

那么现在问题来了,如何让前端知道用户已经登录了呢?当时摸索了半天,才解决了这个问题,实际上 callback 接口那少了一步,最后不应该将用户信息显示出来,不只是为了安全,最后一步应该是重定向

比如,后端在验证成功后,签发一个 token,将 token 通过 url 参数以重定向的形式回传给前端,前端可以顺势显示一个”已登录成功”,再回到首页。

题外话

Github 授权登录的接口我其实在几年前就已经实现过了,流程图也看了好几回,但是没有把这个技术完整地在前后端实现一遍,事实上实现起来才会发现一些隐藏的问题,看理论还不一定能意识到。