某某茶叶有限公司欢迎您!
金沙棋牌在线 > 金沙棋牌在线 > OAuth2客户端能否无感知授权

OAuth2客户端能否无感知授权

时间:2019-12-29 06:39

Java OAuth 2.0 客户端编程(一): 资源所有者密码凭据授权

金沙棋牌在线 1

适应范围

Java OAuth 2.0 客户端编程(二): 客户端凭据授权

查了OAuth2的相关资料,OAuth一共有四种模式,授权码授权模式和隐式授权模式会在客户端授权时弹出授权页面让用户确认,另外两种模式是密码模式和客户端凭证模式,虽然用户不需要确认授权,但是都没有用到clientId和clientSecret。想问一下,既用到clientId和clientSecret,有不需要用户确认授权,是不是不符合OAuth2的规范。还有一个问题是,OAuth2或者JWT是否适用于websocket的鉴权。

认证服务器不提供像用户数据这样的重要资源,仅仅是有限的只读资源或者一些开放的API。例如使用了第三方的静态文件服务,如Google Storage或Amazon S3。这样,你的应用需要通过外部API调用并以应用本身而不是单个用户的身份来读取或修改这些资源。这样的场景就很适合使用客户端证书授权。

Java OAuth 2.0 客户端编程(三):认证码授权

流程剖析

概述

OAuth 是一个开放的授权标准,允许客户端代表一个资源所有者获得访问受保护服务器资源的访问权。资源所有者可以是另一个客户端或最终用户。OAuth 还可以帮助最终用户将对其服务器资源的访问权限授权给第三方,而不必共享其凭据,比如用户名和密码。本系列文章遵从 RFC6749 中列出的 OAuth 2.0 授权框架。可以在 Internet Engineering Task Force 的网站上找到 RFC 6749 中列出的完整 OAuth 2.0 授权框架(请参阅 参考资料)。

金沙棋牌在线 2

授权批准

授权批准是一种凭据,可代表资源所有者用来获得访问受保护资源的访问权。客户端使用此凭据获取访问令牌,而且此访问令牌最终将与请求一起发送,以便访问受保护的资源。OAuth 2.0 定义了四种授权类型:

  1. 授权码
  2. 隐式
  3. 资源所有者密码凭据
  4. 客户端凭据

这个文章系列由四部分组成,将会引导您使用上面列出的每种授权类型在 Java™ 编程中实现 OAuth 2.0 客户端。在第 3 部分中,我将解释如何实现认证码授权。本文详细介绍此类授权,并解释示例客户端代码,此代码可用于兼容 OAuth 2.0 的任何服务器接口,以便支持此授权。在本文的最后,您应该对客户端实现有全面的了解,并准备好下载示例客户端代码,自己进行测试。

  1. 用客户端证书交换访问令牌

认证码授权

此授权已针对机密性客户端进行了优化,用于获得访问令牌和刷新令牌。这是一个基于重定向的流程,因此,客户端必须能够与资源所有者的用户代理(通常是 Web 浏览器)进行交互,并且还必须能够(通过重定向)接收来自授权服务器的传入请求。

认证码授权如 图 1 所示。

应用程序需要向认证服务器申请访问令牌,而该请求则需要客户端证书进行认证。

图 1. 授权码流程

金沙棋牌在线 3

图 1 中所示的流程包括以下步骤:

  • (A) 客户端(通常是一个 Web 应用程序)发起流程,将资源所有者的用户代理(通常是 Web 浏览器)定位到授权端点。客户端的请求包括客户端标识符、请求范围、本地状态和一个重定向 URI。在访问获得批准(或拒绝)之后,授权服务器将用户代理(通常是 Web 浏览器)定向回到重定向 URI。
  • (B) 资源所有者通过用户代理对授权服务器进行身份验证,并批准或拒绝客户端的访问请求。
  • (C) 如果资源所有者批准了访问请求,授权服务器将会使用先前(在请求或客户端注册时)提供的重定向 URI 将用户代理(通常是 Web 浏览器)重定向回客户端。重定向 URI 包括客户之前提供的授权码以及所有本地状态。
  • (D) 客户端从授权服务器的令牌端点发出访问令牌请求,其中包括上一步中收到的授权码。在发出请求时,客户端使用客户端凭据与授权服务器进行身份验证。客户端还包括用于获得验证授权码的重定向 URI。
  • (E) 授权服务器对客户端进行身份验证。它验证授权码,并确保所收到的重定向 URI 匹配在步骤 (C) 中用于重定向客户端的 URI。如果有效,授权服务器将会返回访问令牌作为响应,并且如果请求离线访问,可以返回刷新令牌。

假设现在我们正在折腾facebook,其认证URL为:

授权码请求

金沙棋牌在线,对应于步骤 (A) 和 (B) 的授权码请求如 图 1 所示。在步骤 (A) 中,客户端采用 application/x-www-form-urlencoded 格式向授权服务器发出一个请求,如 清单 1 所示。

清单 1. 授权码请求的示例
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

该请求必须包含以下参数:

  • response_type:必选项。该值必须设置为 code
  • client_id:必选项。客户端 ID。
  • redirect_uri:必选项。用于用户代理重定向。
  • scope:可选项。访问请求的范围。
  • state:可选项。保持请求和回调之间的状态。

在授权服务器验证请求后,服务器将一个 HTTP 重定向代码 302 响应发送回客户端。该响应还将在 http Location 标头中包括一个重定向 URI。在步骤 (B) 中,客户端必须将用户代理(通常是 Web 浏览器)重定向到此 URI。这种重定向 URI 通常是一个登录页面,资源所有者可以使用其凭据进行登录,并批准/撤销客户端的访问请求。

这里需要使用POST请求并附带以下参数:

授权码响应

授权码响应该如 图 1 的步骤 (C) 中所示。如果资源所有者批准了访问请求,授权服务器会发出一个授权码。授权服务器将用户代理重定向到步骤 (A) 中作为请求的一部分的重定向 URI,并将授权码包含为重定向 URI 的查询组件的一部分,这里采用的是 application/x-www-form-urlencoded 格式。

URI 参数如下:

  • Code:必选项。由授权服务器生成的授权码。该代码是临时的,并且必须在生成后很快过期。客户不得多次使用授权码。使用相同代码进行的任何进一步请求都应该被授权服务器撤销。授权码被绑定到客户端标识符和重定向 URI。
  • State:必选项。如果客户端的授权码请求中存在 state 参数,此参数必须设置为与从客户端接收的值完全相同。

grant_type

访问令牌请求

这对应于 图 1 中的步骤 (D)。客户端采用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出一个请求,如 清单 2 所示。

这里为“client_credentials”

清单 2. 访问令牌请求的示例
POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

             grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
             &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom&client_id=c342

访问令牌请求必须设置下列参数:

  • grant_type:必选项。该值必须设置为 authorization_code
  • client_id:必选项。客户端 ID。
  • client_secret:可选项。密码,用于与授权服务器进行身份验证。
  • code:必选项。从服务器收到的授权码。
  • redirect_uri:必选项。在步骤 (A) 中发送的完全一样。

授权服务器验证该代码和重定向 URI 是有效的。在存在机密性客户端的情况下,授权服务器也使用在其请求的主体或 Authorization 标头中传递的客户端凭据来对客户端进行身份验证。

client_id

访问令牌响应

这对应于 图 1 中的步骤 (E)。如果访问令牌请求是有效的,而且获得了授权,授权服务器会在一个访问令牌响应中返回访问令牌。成功的响应示例如 清单 3 所示。

应用注册时获得的client id

清单 3. 成功的访问令牌响应示例
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"Bearer",
  "expires_in":3600,
  "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
  "example_parameter":"example_value"
}

如果请求无效,或者未经授权,那么授权服务器将会使用代码返回一个相应的错误消息。

client_secret

刷新访问令牌请求

这是一个可选步骤,如果客户端请求离线访问,并在访问令牌请求中提供一个 refresh_token,则可以此阿勇此步骤。访问令牌是暂时性的,通常在一个小时后到期。访问令牌到期后,客户端需要重复身份验证过程,资源所有者需要进行登录,并提供授权,让客户可以再次发出访问令牌请求。

如果客户需要刷新访问令牌,而资源所有者没有位于浏览器上,无法进行登录和身份验证,则客户端可以采用离线访问。客户端可以在发出第一个授权码请求时请求离线访问(参见步骤 (A))。根据这项计划,除了访问令牌之外,授权服务器还会返回刷新令牌。刷新令牌是一个长寿令牌,不会过期,除非明确由资源所有者撤销。每当访问令牌到期时,客户端可以使用刷新令牌来重新生成一个访问令牌,资源所有者无需登录和授权访问请求。

客户端采用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出一个请求,如 清单 4 所示:

应用注册时获得的client secret

清单 4. 请求令牌端点
POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

请求参数的定义如下:

  • grant_type:必选项。该值必须设置为 refresh_token
  • refresh_token:必选项。这是之前从访问令牌请求获得的令牌。
  • scope:可选项。访问请求的范围。

授权服务器验证刷新令牌并发出一个新的访问令牌。

以下是一个通过命令行HTTP客户端curl发起的请求示例:

刷新访问令牌响应

如果请求成功,授权服务器将会返回一个新的访问令牌。成功的响应示例如 清单 5 所示。

1
2
3
4
curl -d "grant_type=client_credentials
&client_id=2016271111111117128396
&client_secret=904b98aaaaaaac1c92381d2" 
https://graph.facebook.com/oauth/access_token
清单 5. 刷新访问令牌响应
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

{
  "access_token":"2YotnFZFEjr1zCsicMWpAA",
  "token_type":"Bearer",
  "expires_in":3600,
  "example_parameter":"example_value"
}

如果请求无效,或者未经授权,那么授权服务器将会使用代码返回一个相应的错误消息。

 

如果认证成功,服务器将会返回access_token: