(A). 客户端将用户导向认证服务器;
(B). 用户决定是否给于客户端授权;
(C). 假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌;
(D). 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值;
(E). 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌;
(F). 浏览器执行上一步获得的脚本,提取出令牌;
(G). 浏览器将令牌发给客户端 。
请求URL:
GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2FcbHTTP/1.1Host: server.example.com
与授权码模式相比,用户的登录环节是一样的,只是在授权成功之后的重定向上,授权码模式是携带一个认证码,由客户端通过认证码申请访问令牌 。而隐式授权模式则直接将访问令牌作为URL的散列部分传递给浏览器,散列部分是专门用于指导浏览器行为的,比如浏览器页面定位的锚点就可以由散列属性来进行判定 。
注意简化授权方式是把令牌直接传递给前端,这是很不安全的 。因此,该授权方式适用于一些对安全性要求不高的场景,并且令牌的有效期必须非常短,通常是在会话期间(session)有效,当浏览器关掉,令牌就失效了 。
3. 用户名密码模式密码模式(Resource Owner Password Credentials Grant),客户端提供一个专用页面,然后用户向客户端提供自己的用户名和密码,客户端使用这些信息,向"服务提供商"索要授权 。在这种模式中,用户必须把自己的用户名密码给客户端,但是客户端不得存储密码 。该授权模式适用于用户对客户端高度信任的情况下使用,一般不支持refresh token 。
文章插图
执行步骤:
(A). 用户向客户端提供用户名和密码;
(B). 客户端将用户名和密码发给认证服务器,向后者请求令牌;
(C). 认证服务器确认无误后,向客户端提供访问令牌;
响应信息:
POST /token HTTP/1.1 Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_type=password&username=johndoe&password=A3ddj3w
注意用户名密码授权方式需要用户给出自己的用户名/密码,显然风险很大,因此只适用于其他授权方式都无法采用的情况,而且必须是用户高度信任的应用 。4. 客户端模式客户端模式,指客户端以自己的名义,而不是以用户的名义,向"服务提供商"发起认证 。严格地说,客户端模式并不属于OAuth2.0框架所要解决的问题 。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题 。
客户端授权模式通常是由客户端提前向授权服务器申请应用公钥、私钥,并通过这些关键信息向授权服务器申请访问令牌,从而得到资源服务器提供的资源,比如常见的微信公众平台、支付宝支付平台授权等 。该模式适用于没有前端的命令行应用中,即在命令行下请求令牌 。
文章插图
执行步骤:
(A). 客户端向认证服务器发起身份认证,并要求一个访问令牌;
(B). 认证服务器确认无误后,向客户端提供访问令牌 。
A步骤中,客户端发出的HTTP请求,包含以下参数: