OAuth2.0授权码和隐式OAuth2.0是一个用于授权的行业标准协议。我们常见的,比如第三方登录,授权第三方应用获取存储在其他服务商的个人数据,都是OAuth2.0的应用场景。OAuth2.0有四种授权方式:AuthorizationcodeImplicitResourceOwnerPasswordCredentialsClientCredentials本文将介绍其中的两种授权方式Authorizationcode和Implicit。基本概念角色OAuth定义了以下四种角色:resourceowner:资源拥有者,授予第三方客户端访问权限的实体。resourceserver:资源服务器,托管和保护资源的服务器,响应持有访问令牌的资源请求。客户端:代表资源所有者并在其权限下请求受保护资源的客户端。authorizationserver:授权服务器,对资源所有者进行身份验证,并在其授权下向客户端颁发访问令牌(accesstoken)。比如我们用微信登录第三方论坛。此时:资源拥有者资源拥有者就是我们微信公众号的个人。资源服务器资源服务器就是微信的服务器,因为这里请求的资源实际上是微信托管保护的用户资源。client客户端就是这个第三方论坛。authorizationserver授权服务器也就是微信的服务器,具体来说就是一个负责处理授权的模块或服务。可以发现资源服务器和授权服务器是紧密相关的。如果服务器是单体架构,那么两者只是同一个服务中的不同模块。AccessToken&RefreshTokenAccessToken:访问令牌,持有访问令牌就相当于被用户授权访问某些资源。出于安全考虑,访问令牌的有效期一般较短。RefreshToken:刷新token,使用refreshtoken获取新的accesstoken,refreshtoken一般有效期较长,可以避免accesstoken过期导致用户频繁重新授权。客户端注册比如我们要用微信登录第三方论坛,第三方论坛首先要用微信注册,表明是合法的第三方客户端,需要获取获取在后续的授权过程中。中使用的一些参数。在开始OAuth授权流程之前,客户端首先要完成注册。注册时一般需要提交以下信息:声明客户端类型。提供用于客户端重定向的URI。其他信息,如应用名称、网站地址、描述、标识、法律条款等。客户端注册完成后,一般会得到以下两个参数:client_idclient_secret这两个参数会在后续的授权过程中用到。下面将正式介绍Authorizationcode和Implicit这两种授权方式的整个流程。授权码授权码授权码方式,这种方式最常用,安全性高。如上图所示,整个流程是:1.客户端发起授权请求,例如:GET/authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=code&scope=openid%20profile&state=ae13d489bd00e3c24Host:oauth-authorization-server.com请求包含以下参数:client_id:获取的唯一值客户端注册。redirect_uri:重定向URL。response_type:值为code,表示授权方式为授权码。scope:访问数据的范围。state:当前会话的唯一值。2.用户登录并确认授权。3、浏览器重定向到客户端的redirect_uri地址,返回code授权码,例如:GET/callback?code=a1b2c3d4e5f6g7h8&state=ae13d489bd00e3c24Host:client-app.com里面的状态要和发起请求的状态保持一致。前三步是在浏览器环境下进行的,后面几步是客户端服务器与OAuth服务器的直接通信。4.客户端发起请求,将accesstoken与code交换,例如:POST/tokenHost:oauth-authorization-server.com...client_id=12345&client_secret=SECRET&redirect_uri=https://client-app.com/callback&grant_type=authorization_code&code=a1b2c3d4e5f6g7h8请求参数:client_id:客户端注册后得到的client_id。client_secret:客户端注册后得到的client_secret。redirect_uri:客户端重定向地址。grant_type:声明授权类型是authorization_code。code:上一步获取的授权码。5、OAuth服务器生成accesstoken并返回数据,例如:{"access_token":"z0y9x8w7v6u5","token_type":"Bearer","expires_in":3600,"scope":"openidprofile",...}响应数据还可能包含刷新令牌。6、客户端调用API请求资源,例如:GET/userinfoHTTP/1.1Host:oauth-resource-server.comAuthorization:Bearerz0y9x8w7v6u57,资源服务器响应:{"username":"username","email":"123@email.com",...}以上就是一个完整的授权码授权和数据获取过程。ImplicitImplicit称之为简化模式或隐藏模式,过程更简单,但安全性也有所降低。如上图所示,整个流程是:1.客户端发起授权请求,例如:GET/authorization?client_id=12345&redirect_uri=https://client-app.com/callback&response_type=token&scope=openid%20profile&state=ae13d489bd00e3c24Host:oauth-authorization-server.com请求包含以下参数:client_id:获取的唯一值客户端注册。redirect_uri:重定向URL。response_type:值为token,表示授权方式为简化模式。scope:访问数据的范围。state:当前会话的唯一值。2.用户登录并确认授权。3.直接生成accesstoken重定向到客户端地址:GET/callback#access_token=z0y9x8w7v6u5&token_type=Bearer&expires_in=5000&scope=openid%20profile&state=ae13d489bd00e3c24Host:client-app.com重定向使用#connection参数,而It不是查询参数。这是因为浏览器在向URI发起请求时,不会携带#号后的数据。使用#也是出于安全考虑。4、客户端调用API请求资源。5、资源服务器响应。以上就是一个简化模型的全过程。结语本文介绍了OAuth2.0中的两种授权方式,Authorizationcode和Implicit。前者最常用也更安全,后者更方便但安全性较低。
