在授权码许可流程中,有一个很重量的角色就是授权服务,它负责授权码和访问令牌的颁发和使用。
提供第三方注册平台
在颁发授权码之前,授权服务需要提供一个平台供第三方软件注册,包括client id, client secret,redirect link和能访问的权限范围(scope)等
颁发授权码
在第三方软件引导用户跳转到授权服务时,在用户看到授权页面前,授权服务会先进行以下的校验
1. 校验用户是否合法(用户可能需要输入用户名和密码进行登陆验证)
2. 校验第三方软件是否合法(曾经注册过),同时跳转时传入的redirect link是否是之前注册过的(避免浏览器伪造)
3. 校验第三方软件请求的权限范围scope是否在之前注册的scope内。
校验通过后,会返回授权页面到前端,用户在授权页面上可以进一步选择第三方软件可以访问的权限范围(比如只能获取名字等)
在用户选完授权范围,点击授权后,授权服务就开始了生成授权码的操作
1. 再一次校验传入的权限范围是否在第三方软件注册时的范围之内
2. 校验响应类型 response_type 的值是否时code,是的话,生成授权码
3. 保存授权码,第三方软件和应用之间的关系。同时保持授权码和scope之间的关系
4. 给授权码设置有效期,OAuth 2.0 规范建议授权码 code 值有效期为 10 分钟,并且一个授权码 code 只能被使用一次。
5. 重定向到第三方软件。
颁发访问令牌
当第三方软件后台通过授权码获取访问令牌时,授权服务要进行以下步骤
1. 验证第三方软件提供的client id和client secret
2. 确认授权码是否有效
3. 生成访问令牌(Access Token)。OAuth 2.0中并没有规定Access Token的格式,但是规定了要符合三个原则:唯一性,不可连续性和不可猜性。
4. 保存Access Token,第三方软件和应用之间的关系。同时保持Access Token和scope之间的关系
5. 为该访问令牌设置一个过期时间 expires_in,比如 1 天。
刷新令牌(Refresh Token)
Access Token的有效期往往很短,当过期后,需要用户重新授权,才能使用,这样带来了不好的用户体验。
所以OAuth 2.0 引入了Refresh Token。当Access Token过期时,第三方软件可以通过Refresh Token重新获取Access Token, 而不需要用户再次授权。
Refresh Token也是有有效期的,同时也是一次性的,当Refresh Token被使用后,会失效。第三方软件通过Refresh Token刷新的时候,会同时返回新的Access Token和RefreshToken。
Refresh Token时在授权服务第一次生成Access Token时,一起生成返回给第三方应用的。
此文章为3月Day4学习笔记,内容来源于极客时间《OAuth2.0 实战课》,强烈推荐该课程!/推荐该课程