1.什么是设备授权码模式
设备授权码模式是 OAuth 2.1 的一种授权模式,旨在解决设备(即客户端)需要访问某些受限的资源但又无法在设备上直接输入用户凭证的情况,比如智能电视、游戏机、IoT 设备、打印机等。它是一种再Spring Security高版本之后出现的一种新的认证方式。其整体工作流程大体分以下七个步骤:
1:设备本身(客户端)发起与授权服务器的通信(比如访问受限资源时发起该请求),post请求、地址形如oauth2/device_authorization,其携带的参数为client_id:设备的唯一标志,scope:授权范围(非必填,如果是多个时只能以空格进行拼装),请求返回信息为user_code,device_code,
verification_uri_complete(也可以访问该地址,转发到登录页,登录完成后就直接跳转到授权页面,因为携带了userCode所以减少了一步,没有3过程),verification_uri,expires_in等信息,并通过某种方式将返回的信息展示给用户(比如显示屏),引导用户再另一设备上完成授权过程。如下图:
2:用户拿到过程1的返回结果后通过智能手机、电脑等具备用户交互能力的设备,访问verification_uri地址,该地止会提示我们进行登录,如下:
3:输入账户密码点击登录后会跳转到用户码输入界面,即过程1返回的user_code,如下:
4:输入用户码点击提交后,则会进一步跳转到授权确认页面,勾选授权,点击提交,则显示操作成功,授权意味着将user_code失效:
5:设备会定期(通常是间隔几秒或几分钟)向授权服务器发送轮询请求,以查询用户是否已经授权。设备会携带之前获取的设备授权码(device_code)和客户端标识符(client_id)等信息,请求格式/oauth2/token
6:授权服务器接收到设备的轮询请求后,会验证设备授权信息,包括设备授权码和客户端标识符等一旦授权服务器确认用户已授权,且设备的设备授权码有效且userCode无效,授权服务器将颁发访问令牌(Access Token)给设备。
7:设备收到授权服务器颁发的访问令牌后,就可以使用该访问令牌来访问受保护的资源。
2.设备授权码底层工作原理
设备授权码底层工作离不开两个重要的核心类:OAuth2DeviceVerificationEndpointFilter和OAuth2DeviceAuthorizationEndpointFilter,其工作流程如下:
接下来我们就详细看一下这两个关键类的作用与源码。
1.OAuth2DeviceAuthorizationEndpointFilter
处理设备发起的授权请求:/oauth2/device_authorization,生成user_code,device_code等,具体源码如下:
在上图中的authenticate方法主要由OAuth2DeviceAuthorizationRequestAuthenticationProvider认证处理器来进行处理,其具体源码如下:
2.OAuth2DeviceVerificationEndpointFilter
响应/oauth2/device_verification请求,用户授权后对user_code进行失效处理。其源码如下:
其authenticate方法的实现离不开OAuth2DeviceAuthorizationConsentAuthenticationProvider认证处理器,具体如下:
至此整个设备授权码的流程就已经完成。
如果您希望更深入地学习Spring Security源码,我强烈推荐您访问以下项目链接:https://gitee.com/chengyadong555/spring-security.git 。在这个项目中,您将发现对Spring Security源码的逐行分析,作者不仅提供了丰富的注释,还融入了自己独到的理解和见解。