某某茶叶有限公司欢迎您!
金沙棋牌在线 > 金沙棋牌在线 > OAuth2:客户端证书授权(Client Credentials)类型的开放授权

OAuth2:客户端证书授权(Client Credentials)类型的开放授权

时间:2019-12-29 06:38

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 还可以帮助最终用户将对其服务器资源的访问权限授权给第三方,而不必共享其凭据,比如用户名和密码。本系列文章遵循 RFC 6749 中所列出的 OAuth 2.0 授权框架。可以在 Internet Engineering Task Force 的网站上找到 RFC 6749 中列出的完整 OAuth 2.0 授权框架(请参阅 参考资料)。

图片 2

授权批准

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

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

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

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

资源所有者密码凭据授权

当资源所有者对客户端有高度信任时,资源所有者密码凭据授权类型是可行的。此授权类型适合于能够获取资源所有者的用户名和密码的客户端。对于使用 HTTP 基础的现有企业客户端,或者想迁移到 OAuth 的摘要式身份验证,该授权最有用。然后,通过利用现有凭据来生成一个访问令牌,然后就可以实现迁移。

例如,Salesforce.com 添加了 OAuth 2.0 作为对其现有基础架构的一个授权机制。对于现有的客户端转变为这种授权方案,资源所有者密码凭据授权将是最方便的,因为他们只需使用现有的帐户详细信息(比如用户名和密码)来获取访问令牌。

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

图 1. 资源所有者密码凭据流

图片 3

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

  1. 资源所有者提供一个可信的 OAuth 2.0 客户端,并提供其用户名和密码。
  2. OAuth 2.0 客户端对授权服务器的令牌端点发出访问令牌请求,其中包括从资源所有者那里收到的凭据。在发出请求时,OAuth 2.0 客户端使用由授权服务器提供的凭据和授权服务器进行身份验证。
  3. 授权服务器对 OAuth 2.0 客户端进行身份验证,并验证资源所有者凭据,如果该凭据是有效的,那么授权服务器会颁发一个访问令牌。

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

访问令牌请求

对应于第二个步骤的访问令牌请求如 图 1 所示。

客户端对令牌端点(授权服务器)发出请求,采用 application/x-www-form-urlencoded 格式发送以下参数。

  • grant_type:必选项。必须将其值设置为 “password”
  • username:必选项。资源所有者的用户名。
  • password:必选项。资源所有者密码。
  • scope:可选项。访问请求的范围

如果客户端类型是机密的,或客户端获得了客户端凭据(或者被分配了其他身份验证要求),那么客户端必须向授权服务器进行身份验证。例如,客户端使用传输层安全性发出下列 HTTP 请求。

清单 1. 向授权服务器进行身份验证
POST /token HTTP/1.1
Host: server.example.com
Authorization:Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=varun&password=ab32vr

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

访问令牌响应

对应于上述步骤 C 的访问令牌响应如 图 1 所示。如果访问令牌请求是有效的,并且获得了授权,那么授权服务器将返回访问令牌和一个可选的刷新令牌。清单 2 显示了一个成功响应的示例。

grant_type

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

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

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

这里为“client_credentials”