面试常问OAuth2授权码

175 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

大纲

  • OAuth2核心概念
  • 支持的授权模式
  • 授权码模式流程
  • JWT和Token

1.OAuth2授权框架

OAuth是Open Authorization授权协议的简称,它是一个开放网络标准,目的是让用户授权第三方应用将个人数据提供给另外的应用程序,而无需将个人极为敏感的例如密码等数据暴露给另外的应用程序。目前主流的版本是OAuth2。

  • 特点:设计简单、支持多种授权模式、安全性较高、协议开放自由实现。
  • 应用场景:需要集成第三方授权登录的场景,例如用微信、支付宝快速登录功能。

2.OAuth2授权模式

2.1 授权码模式(见后文)

2.2 密码模式

这种模式需要让用户将自己的账户密码暴露给三方应用,这种模式并不安全,虽然属于RFC规范,但是这种场景必须得高度信任这个应用,例如著名权威公司等。

     1. 用户向应用客户端暴露自己的用户名、密码。
     1. 应用客户端将用户名和密码发送给授权服务器,授权服务器校验并返回令牌。

2.3 简化模式

这种模式使用较少,一般出现在没有服务端的应用,纯前端的应用架构。这种模式浏览器直接向授权服务器申请令牌,令牌直接保存在前端,安全性不高,所以只适合一些安全性不高的场景。

2.4 客户端模式

这种模式抛弃了用户的概念,客户端以自己的名义发起授权请求,这种模式适用于命令行的一些基础应用。

3.OAuth2授权码模式

授权码模式是相对比较安全的一种授权模式,也是应用最广泛的一种模式。这种模式需要客户端、服务端、三方服务器共同协调完成,这种模式需要三方应用客户端通过授权得到一个Code码,客户端拿着这个code请求自己公司的服务端,服务器通过code去三方应用获取一个Access_Token,得到三方的Access_Token以后,服务器就可以调用API获取用户的一些非敏感信息了,例如可以拿到用户的头像、用户名、账号ID、open_id、union_id等。举个微信授权登录的场景:

  1. 用户进入我司A应用,用户点击“使用微信登录”,客户端唤起微信授权界面。
  2. 界面展示“是否在A应用登录微信账户”,页面等待用户点击确认授权。
  3. 用户点击同意,那么微信后台就会给A应用的客户端一个Code码,或者通过跳转重定向页面在url上带上这个Code码给客户端。
  4. 客户端将这个Code码发给我司的Java服务器,Java端将Code码、微信应用秘钥等参数,向微信后台发起API调用,拿到Access_Token,此时服务器就已经知道这个用户是谁,就可以给用户颁发自己应用的Token了,也可以拿着这个access_token去微信获取用户信息等。
  5. 用户在客户端的操作,客户端请求Java服务器的API就会在Authorization的Header里面带上这个Token。

image.png

3.1 令牌的刷新

令牌为了安全考虑,一般会有一个时间不长的过期时间,例如2小时等。如果让用户重新走一遍流程虽然这样更安全,但是比较麻烦。所以,一般授权服务器在返回令牌的时候会同时返回两个令牌,一个用于获取用户数据,另一个负责刷新这个access_token,名字一般叫Refresh_Token

4.JWT

JSON Web Token的简称,它是一个RFC 7519开放标准,特点是简介、通过JSON数据格式包装对象信息、安全性高、防篡改。 JWT由三部分组成:

  • header头部:描述JWT的基本信息(也是一个JSON),例如类型、签名算法,例如RSA、SHA256等,然后进行Base64加密形成一段字符串。
  • payload载荷内容:也是一个JSON格式,存放Token里面的核心信息,例如用户信息、过期时间等。然后进行Base64加密形成一段字符串。
  • signature签名:将header和payload通过base64加密以后的文本再组合secret私钥和header头里面记录的加密算法进行整体加密,得到一个字符串。注意,这个secret一定要保存在服务端。

4.1 JJWT

JWT的Java支持工具库,只需要Maven引入,开箱即用。通过Jwts.builder来生成Token。通过Jwts.parser来解析Token。