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

澳门新葡亰平台游戏网站 7

Java OAuth 2.0 客商端编制程序(少年老成):
能源全部者密码凭据授权

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

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

概述

OAuth
是叁个盛放的授权规范,允许顾客端代表八个能源所有者获得访谈受有限支持服务器能源的访谈权。能源全部者能够是另三个客户端或最终客商。OAuth
还是能帮助最后客户将对其服务器能源的拜会权限授权给第三方,而不用分享其证据,举个例子客户名和密码。本种类文章坚守ENVISIONFC6749 中列出的 OAuth 2.0 授权框架。可以在 Internet Engineering Task
Force 的网址上找到 福特ExplorerFC 6749 中列出的完全 OAuth 2.0
授权框架(请参阅 参谋资料)。

授权批准

授权批准是生机勃勃种凭据,可代表财富全数者用来收获访谈受保证财富的访谈权。客商端应用此凭据获取访谈令牌,何况此会见令牌最后将与须求一同发送,以便访谈受保险的财富。OAuth
2.0 定义了四种授权类型:

  1. 授权码
  2. 隐式
  3. 能源全部者密码凭据
  4. 顾客端凭据

以此稿子类别由四片段组成,将会辅导你使用方面列出的每一个授权类型在 Java™
编制程序中达成 OAuth 2.0 客商端。在第 3
部分中,笔者将分解什么落到实处认证码授权。本文详细介绍此类授权,并解释示例客商端代码,此代码可用于包容OAuth 2.0
的此外服务器接口,以便协理此授权。在本文的终极,您应该对客商端完结成周到的刺探,并预备好下载示例客户端代码,本人实行测量检验。

认证码授权

此授权已针对机密性客商端进行了优化,用于获取访谈令牌和刷新令牌。那是二个依据重定向的流水生产线,因而,客商端必须可以与能源全部者的顾客代理(平常是
Web
浏览器)实行相互,并且还非得能够(通过重定向)选择来自授权服务器的传入诉求。

认证码授权如 图 1 所示。

图 1. 授权码流程

澳门新葡亰平台游戏网站 1

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

  • (A卡塔尔国 客户端(日常是三个 Web
    应用程序)发起流程,将能源全部者的客户代理(平时是 Web
    浏览器)定位到授权端点。顾客端的央浼满含客户端标记符、央浼范围、本地景况和二个重定向
    UCRUISERI。在拜见获得特许(或拒却)之后,授权服务器将客商代理(平日是 Web
    浏览器)定向回到重定向 U奥迪Q5I。
  • (B卡塔尔(قطر‎能源全数者通过客商代理对授权服务器进行身份验证,并获准或拒绝顾客端的拜候诉求。
  • (C卡塔尔(قطر‎假诺能源全部者许可了访问要求,授权服务器将会动用早前(在呼吁或客商端注册时)提供的重定向
    UTiguanI 将客商代理(平日是 Web 浏览器)重定向回看客端。重定向 USportageI
    包含客商在此以前提供的授权码以至全体地点情状。
  • (D卡塔尔国顾客端从授权服务器的令牌端点发出国访问谈令牌乞求,个中囊括上一步中吸取的授权码。在发出诉求时,顾客端应用顾客端凭据与授权服务器举办身份验证。客商端还蕴含用于获取认证授权码的重定向
    U宝马7系I。
  • (E卡塔尔(قطر‎授权服务器对客户端实行身份验证。它申明授权码,并保管所采用的重定向
    U汉兰达I 相称在步骤 (C卡塔尔国 中用于重定向顾客端的
    UCRUISERI。借使可行,授权服务器将会回来访谈令牌作为响应,而且只要央求离线访谈,能够回去刷新令牌。

授权码诉求

对应于步骤 (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 标头中归纳二个重定向
U奥迪Q5I。在步骤 (B卡塔尔国 中,客商端必得将顾客代理(平时是 Web 浏览器)重定向到此
U揽胜极光I。这种重定向 U奥迪Q5I
平日是一个记名页面,能源全体者能够利用其证据进行登入,并获准/废除客商端的拜候央浼。

授权码响应

授权码响应该如 图 1 的步骤 (C卡塔尔中所示。倘诺财富全部者许可了访谈乞求,授权服务器会时有爆发几个授权码。授权服务器将顾客代理重定向到步骤
(A卡塔尔 中作为央求的大器晚成有个其余重定向 UCR-VI,并将授权码富含为重定向 ULANDI
的询问组件的后生可畏有的,这里运用的是 application/x-www-form-urlencoded 格式。

UHighlanderI 参数如下:

  • Code:必选项。由授权服务器生成的授权码。该代码是临时的,並且必需在变幻莫测后飞快过期。客商不得数次使用授权码。使用同样代码进行的此外更进一层诉求都应有被授权服务器废除。授权码被绑定到顾客端标记符和重定向
    UQashqaiI。
  • State:必选项。倘若顾客端的授权码乞求中存在 state 参数,此参数必需安装为与从客商端选取的值完全相近。

会见令牌央求

那对应于 图 1 中的步骤
(D卡塔尔(قطر‎。客商端应用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出三个伸手,如
清单 2 所示。

项目清单 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:必选项。在步骤 (AState of Qatar 中发送的通通相通。

授权服务器验证该代码和重定向 U福睿斯I
是可行的。在存在机密性顾客端的动静下,授权服务器也应用在其诉求的中央或
Authorization 标头中传递的顾客端凭据来对客商端进行身份验证。

做客令牌响应

那对应于 图 1 中的步骤
(E卡塔尔(قطر‎。尽管访谈令牌诉求是实用的,并且获得了授权,授权服务器会在七个会见令牌响应中回到访问令牌。成功的响应示举例清单 3 所示。

清单 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"
}

比如伏乞无效,或许未经授权,那么授权服务器将会利用代码重回一个一呼百应的荒唐音讯。

刷新访谈令牌诉求

那是一个可选步骤,假若顾客端央浼离线访谈,并在拜会令牌须求中提供贰个 refresh_token,则能够此阿勇此步骤。访问令牌是有时性的,平常在二个小时后到期。访谈令牌到期后,客商端供给再行身份验证进度,财富全部者必要实行登入,并提供授权,让顾客能够另行发出国访问谈令牌央浼。

设若客商供给刷新访谈令牌,而财富全体者未有放在浏览器上,不能够进行登陆和身份验证,则顾客端能够行使离线访谈。顾客端可以在产生第叁个授权码央浼时乞请离线访问(参见步骤
(A卡塔尔国)。依照这项布置,除了访谈令牌之外,授权服务器还有可能会回来刷新令牌。刷新令牌是一个长寿令牌,不会晚点,除非分明由财富全体者撤消。每当访谈令牌到期时,用户端能够采取刷新令牌来再一次生成贰个做客令牌,能源全部者不须求登入和授权访问央求。

客商端应用 application/x-www-form-urlencoded 格式向令牌端点(授权服务器)发出叁个须要,如
清单 4 所示:

清单 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:可选项。访谈须要的约束。

授权服务器验证刷新令牌并发生二个新的访谈令牌。

刷新访问令牌响应

若是央求成功,授权服务器将会重临一个新的拜访令牌。成功的响应示比如 清单5 所示。

项目清单 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"
}

只要诉求无效,或许未经授权,那么授权服务器将会接纳代码再次回到二个相应的大错特错消息。

 

设置

身体力行 Outh2.0 客商端是三个动态的 Web
项目。您能够从 下载 部分下载包含项目和源代码的
.war 文件。将 .war 文件导入您的 Eclipse 情形。

先决条件

你供给设置 Eclipse IDE for Java EEdevelopers,以便设置开采条件,并导入附加项目。您能够从 Eclipse
下载页面 下载 Eclipse。

你必要 Apache 汤姆cat JSP/Servlet 容器来运作 OAuth 2.0 Web
客商端。您能够从 Apache 汤姆cat
下载页面 下载 Tomcat。

依靠关系

客商端代码项目决定于以下 JA昂科拉 文件:

  1. commons-codec-1.6.jar
  2. commons-logging-1.1.1.jar
  3. httpclient-4.2.5.jar
  4. httpclient-cache-4.2.5.jar
  5. httpcore-4.2.4.jar
  6. httpmime-4.2.5.jar
  7. json-simple-1.1.1.jar

第 1 至 6 点中提到的 JA陆风X8 文件能够在 HttpComponents JARAV4文件中找到,您能够从 HttpComponents Downloads
下载页面 下载该文件。能够从 JSON
Simple
项目 下载json-simple-1.1.1.jar 文件。确认保障那几个jar 文件被复制到 Apache 汤姆cat 安装目录的 lib 文件夹中。Tomcat
中私下认可情形下或然曾经提供了某个不可缺少的 JA福睿Sven件,所以你只需复制贫乏的公文就可以。

将 project .war 文件导入 Eclipse

在装置了 Eclipse 和 Apache 汤姆cat
之后,须要导入来自 下载 部分的
.war 文件。为了导入 war 文件,请依照 Eclipse 网址的 “导入 Web 压缩
(WAR)
文件”
中列出的那些总结步骤。

在将 .war 文件导入到 Eclipse 时,请确定保证涉及了 Tomcat
服务器与你的花色。您供给选择 汤姆cat 版本,并提供 汤姆cat
安装根目录的路线,以便变成布局。

你能够在 “制造多个 汤姆cat
服务器 ”
中掌握有关怎么着关联 汤姆cat 服务器与品种的更详实表达。

在中标将 .war 文件导入到 Eclipse 职业区后,您会在品种档次中的 Java
Resources/src 下找到源代码。

运行 OAuth 2.0 客户端

在功成名就导入 .war 文件并利用要求的 JAPRADO 文件设置 汤姆cat
之后,您可以运作客商端:右键单击项目名称 OAuth2.0_AuthCode 并选择 Run
As
 和 Run on Server

那会将客商端安排到服务器,并在 Eclipse 内部浏览器中加载 index.html
页面。就个人来讲,小编更爱幸亏表面浏览器上与 Web 客户端实行交互作用。

你可以从其它浏览器导航至以下网站,访问 Web
顾客端: http://localhost:8080/OAuth2.0_AuthCode

世袭章节会详解客商端代码,并告诉您怎样使用流行的 OAuth 2.0
包容的服务器(如 Salesforce、Google 和 IBM)测量试验这些顾客端。

OAuth 2.0 顾客端代码

本文中的示例 OAuth 2.0 客户端完毕了认证码授权。示例客商端代码是二个 Web
应用程序,并非八个常常的 Java
项目,前面一个适用于前面小说中所钻探的授权类型。这是因为,认证码授权流程的目标是满足Web 应用程序,并针对性 Web 浏览器的客户代理进行了优化。

输入参数

使用在类型的 src 文件夹中提供的 Oauth2Client.config
属性文件向客商端提供所需的输入参数。输入参数是:

  • scope:那是二个可选参数。它代表做客必要的限量。由服务器再次来到的拜候令牌只好够访谈在
    scope 中涉及的那些服务。
  • state:那是三个可选参数,用于维持顾客端须要和根源授权服务器的重定向响应时期的场地,目的是确定保证客户端的完整性。
  • grant_type:须要将以此参数设置为 authorization_code,表示认证码授权类型。
  • client_id:注册应用程序时由能源服务器提供的客户端或使用者 ID。
  • client_secret:注册应用程序时由财富服务器提供的顾客端或使用者的密码。
  • access_token:令牌端点响应有效的和经过授权的走访令牌央浼时所重回的访问令牌。由授权服务器重临的授权代码用于交流访问令牌。
  • refresh_token:令牌端点响应有效的和通过授权的拜会令牌央浼时所重回的刷新令牌。刷新令牌能够用于刷新过期的拜访令牌,不要求财富全部者的留存就足以另行实行身份验证。客户端须求分明地向服务器需要刷新令牌。
  • redirect_uri:授权服务器将顾客代理作为授权码央浼的意气风发部分重定向到该
    ULacrosseI。授权码被发送到这几个 U中华VI。
  • authentication_server_url:那意味着授权服务器。获取授权码的全体请求都急需被发送到那么些USportageL。
  • token_endpoint_url:这意味着令牌端点。通过刷新令牌央浼来获得访谈令牌和刷新访谈令牌的持有央浼都亟待发送到这么些U宝马7系L。
  • resource_server_url:那意味着必要调换的能源服务器的 UHavalL,通过将
    Authorization 标头中的访谈令牌传递给它,访问受保险的财富。
  • approval_prompt_key:授权服务器用于定义授权提醒条件的属性名。平常,各种授权服务器(Salesforce、Google、IBM
    等)都有四个亟需用作授权码央求的一片段传递的自定义属性,用于表示该客户端是还是不是要强迫实施各类央求的授权提示。Google的属性名是approval_prompt。对于 Salesforce,它是 login consent
  • access_type_key:授权服务器用于定义访谈类型标准的属性名。平日,各类授权服务器(Salesforce、Google、IBM
    等)都有叁个自定义方法,顾客端能够透过它传达命令,比方它想要多少个刷新令牌和做客令牌作为访谈令牌央浼的风度翩翩部分。Google通过提供 access_type 属性施行此办法。Salesforce
    要求您输入 refresh_token 值作为 scope 的生机勃勃局部。
  • access_type_valueaccess_type_key 属性的值。对于
    Google,您需求将 offline 值传递给服务器,以含有刷新令牌和会见令牌。

图 2 展现了演示客商端代码的 index.html 页面。在 Eclipse
中中标安插项目并将其安顿到 汤姆cat 后,您应该见到那么些页面。

图 2. 测量检验顾客端首页

澳门新葡亰平台游戏网站 2

客商端暴光了您要求领悟的有关 OAuth 2.0
的三种最基本操作。首先,顾客端显示了如何从服务器获取一个做客令牌。其次,客户端展示了怎么使用现成的拜访令牌访谈来自服务器的受保障能源。

运行客商端:

  • 首先,在 Oauth2Client.config 文件中输入全体所需的值。
  • 单击 Start Test 来获取访谈令牌。二个 HTTP GET 央求被发送到
    OAuth2Client servlet,能够在偏下 U索罗德I
    访谈它,
  • 顾客分界面代码传递下边包车型地铁询问参数,作为调用 OAuth2Client servlet
    的大器晚成部分: caller=token (access token request), caller=resource (access protected resource request)

项目清单 6 中的顾客端代码段选自 OAuth2Client 类的 doGet 方法。

清单 6. 节选自示例客商端的 doGet 方法
String caller = request.getParameter(OAuthConstants.CALLER);
String code = request.getParameter(OAuthConstants.CODE);

//Load the properties file
Properties config = OAuthUtils.getClientConfigProps(OAuthConstants.CONFIG_FILE_PATH);

//Generate the OAuthDetails bean from the config properties file
OAuth2Details oauthDetails = OAuthUtils.createOAuthDetails(config);

//Validate Input
List<String> invalidProps = OAuthUtils.validateInput(oauthDetails);
    if(invalidProps!=null && invalidProps.size() == 0){
        //Validation successful

        if(OAuthUtils.isValid(caller)){
            //Request was sent from web application.
            //Check type of request
            if(caller.equalsIgnoreCase(OAuthConstants.TOKEN)){
                //Request for Access token
                oauthDetails.setAccessTokenRequest(true);
                String location =                   
                OAuthUtils.getAuthorizationCode(oauthDetails);

                //Send redirect to location returned by endpoint
                response.sendRedirect(location);
                return;
        }
        else{
            //Request for accessing protected resource
                if(!OAuthUtils.isValid(oauthDetails.getResourceServerUrl())){
                    invalidProps.add(OAuthConstants.RESOURCE_SERVER_URL);

                }

                if(!OAuthUtils.isValid(oauthDetails.getAccessToken())){
                    if(!OAuthUtils.isValid(oauthDetails.getRefreshToken())){
                        invalidProps.add(OAuthConstants.REFRESH_TOKEN);
                    }

                }

                if(invalidProps.size() > 0){
                    sendError(response, invalidProps);
                    return;
                }

                Map<String,String> map = OAuthUtils.getProtectedResource(oauthDetails);
                response.getWriter().println(new Gson().toJson(map));
                return;
            }
        }
        else if(OAuthUtils.isValid(code)){
            //Callback from endpoint with code.
            Map<String,String> map = OAuthUtils.getAccessToken(oauthDetails, code);
            response.getWriter().println(new Gson().toJson(map));
            return;
        }
        else{
            //Invalid request/error response
            String queryString = request.getQueryString();
            String error = "Invalid request";
            if(OAuthUtils.isValid(queryString)){
                //Endpoint returned an error
                error = queryString;
            }
            response.getWriter().println(error);
            return;

            }
        }
        else{
            //Input is not valid.Send error
            sendError(response, invalidProps);
            return;

        }

清单 6 的注意事项:

  • 客商端检索查询参数 caller 和 code。如前方所示,由顾客分界面发送该央浼, caller 参数会有二个可行的值;不然,授权服务器发送该须求作为重定向调用的风姿罗曼蒂克局地,何况 code 会有一个使得的值。
  • 接下来,客商端通过读取 OAuth2Client.config 文件中提供的性质,创造多少个 OAuthDetails bean。
  • 接下来,验证此 bean
    的不利和完整性。若是发现任何无效属性或缺点和失误的习性,相应于缺点和失误/不许确的习性的大错特错响应被发送到客户分界面。
  • 接下来,顾客端代码继续验证所乞请的操作,并调用相应的操作。

探问令牌必要

清单 7 中的代码演示了怎么发生授权代码诉求。

项目清单 7. 授权码央求代码

点击查看代码清单

至于 项目清单 7 中的代码的注意事项:

  • 代码在朝气蓬勃始发就创办二个 HttpPost 方法,它用来发送 U福特ExplorerL 编码的参数。
  • response_typeclient_id 和 redirect_uri 是逼迫性参数,被归纳在伸手中。
  • 任何可选参数,比方 statescopeapproval_prompt_key/value 和 access_type_key/value,如果布置文件中提供了它们的灵光值,则将它们也包含在内。
  • 使用 DefaultHttpClient 向授权服务器发出要求。
  • 授权服务器验证乞请参数,并回复 302 HTTP
    重定向代码与 Location 标头。
  • 代码识别从授权服务器收到的 302,并从响应标头中查找 Location 标头。
  • Location 标头包涵顾客端重定向客户代理(Web 浏览器)所需的 U奥迪Q7I。该
    UOdysseyI 平日是几个记名提醒,让资源全部者登陆并向顾客端提供授权。
  • 岗位 U凯雷德I 的值被重返给调用方法 (OAuth2Client.doGet())。
  • Oauth2Client.doGet() 方法将响应重定向到岗位 U君越I。
  • 财富全部者的客户代理(Web
    浏览器)未来被重定向到登陆页面/授权页面,财富全体者需求报到此页面,并向发出央求的顾客端提供授权。
  • 能源全部者为顾客端提供授权后,授权服务器将会采用在原始授权码央求中传递的重定向
    U哈弗I 来发送 code

事项清单 8 中的代码展现了接受在上一步中接收到的 code
来爆发最后的访谈令牌诉求。

清单 8. 示范代码访问令牌央浼
HttpPost post = new HttpPost(oauthDetails.getTokenEndpointUrl());
        String clientId = oauthDetails.getClientId();
        String clientSecret = oauthDetails.getClientSecret();
        String scope = oauthDetails.getScope();
        Map<String, String> map = new HashMap<String, String>();

        List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();

        parametersBody.add(new BasicNameValuePair(OAuthConstants.GRANT_TYPE,
                oauthDetails.getGrantType()));

        parametersBody.add(new BasicNameValuePair(OAuthConstants.CODE,
                authorizationCode));

        parametersBody.add(new BasicNameValuePair(OAuthConstants.CLIENT_ID,
                clientId));

        if (isValid(clientSecret)) {
            parametersBody.add(new BasicNameValuePair(
                    OAuthConstants.CLIENT_SECRET, clientSecret));
        }

        parametersBody.add(new BasicNameValuePair(OAuthConstants.REDIRECT_URI,
                oauthDetails.getRedirectURI()));

        DefaultHttpClient client = new DefaultHttpClient();
        HttpResponse response = null;
        String accessToken = null;
        try {
            post.setEntity(new UrlEncodedFormEntity(parametersBody, HTTP.UTF_8));

            response = client.execute(post);
            int code = response.getStatusLine().getStatusCode();

            map = handleResponse(response);
            accessToken = map.get(OAuthConstants.ACCESS_TOKEN);

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }

        return map;

项目清单 8 的注意事项:

  • 该代码应用 HttpPost 方法向令牌端点发出国访问谈令牌乞求。
  • grant_typecodeclient_id 和 redirect_uri 是强逼性参数。
  • 如果 client_secret 是有效的,那么它也会蕴藏在伸手中。
  • code 的值是原先的央浼中由授权服务器再次来到的代码。
  • 假使诉求是卓有效能的,那么令牌端点将会回到访谈令牌,借使诉求是离线访问,则会重回刷新令牌。
  • 请留意,作为该央浼的生机勃勃有的发送的重定向 U奥迪Q7I
    需求与作为授权码供给的一片段发送的重定向 U中华VI
    完全相符。令牌端点需求表明该重定向 UCRUISERI 与客商端的应用程序中所钦命的
    UHighlanderI 相相配,其数额由令牌端点提供。

刷新访谈令牌

如前所述,访问令牌平日是有时性的,规范的寿命是多少个时辰。刷新令牌允许顾客端自动刷新过期的访问令牌,不供给财富全部者登陆,不偏不倚新对客商端进行身份验证。清单9 中的代码表明了那或多或少。

项目清单 9. 刷新访谈令牌的演示代码
String clientId = oauthDetails.getClientId();
String clientSecret = oauthDetails.getClientSecret();
String scope = oauthDetails.getScope();
String refreshToken = oauthDetails.getRefreshToken();
Map<String, String> map = new HashMap<String, String>();

        if (!isValid(refreshToken)) {
            throw new RuntimeException(
                    "Please provide valid refresh token in config file");
        }

        List<BasicNameValuePair> parametersBody = new ArrayList<BasicNameValuePair>();

        parametersBody.add(new BasicNameValuePair(OAuthConstants.GRANT_TYPE,
                OAuthConstants.REFRESH_TOKEN));

        parametersBody.add(new BasicNameValuePair(OAuthConstants.REFRESH_TOKEN,
                oauthDetails.getRefreshToken()));

        if (isValid(clientId)) {
            parametersBody.add(new BasicNameValuePair(OAuthConstants.CLIENT_ID,
                    clientId));
        }

        if (isValid(clientSecret)) {
            parametersBody.add(new BasicNameValuePair(
                    OAuthConstants.CLIENT_SECRET, clientSecret));
        }

        if (isValid(scope)) {
            parametersBody.add(new BasicNameValuePair(OAuthConstants.SCOPE,
                    scope));
        }

        DefaultHttpClient client = new DefaultHttpClient();
        HttpResponse response = null;
        try {
            post.setEntity(new UrlEncodedFormEntity(parametersBody, HTTP.UTF_8));

            response = client.execute(post);
            int code = response.getStatusLine().getStatusCode();

            map = handleResponse(response);

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }

        return map;

清单 9 的注意事项:

  • 该代码应用 HttpPost 方法向令牌端点发出须求。
  • grant_type 和 refresh_token 参数是强逼性的。
  • 假定可行,client_idclient_secret 和 scope 也被回顾在内。
  • 比如乞请有效,令牌端点会再次回到多少个新的拜候令牌。

访谈受保证能源

清单 10中的代码演示了怎么运用访谈令牌来访谈受珍爱的财富。要是访谈令牌过期,则刷新采访令牌,然后重试访问受保险的财富。

事项清单 10. 拜会受保险财富的现身说法代码

点击查阅代码项目清单

项目清单 10 的注意事项:

  • 此方法运用从配置文件检索到的值来经受 OauthDetails bean。
  • 一孔之见,这种艺术将尝试运用简便的 HttpGet 从财富服务器中寻觅受保证的财富。
  • 为了向财富服务器实行身份验证,须求将做客令牌作为 Authorization
    标头的后生可畏部分开展发送。比如,Authorization:``Bearer accessTokenValue
  • 该代码创立了一个 DefaultHttpClient,向能源服务器发出七个 get
    央求。
  • 只要从能源服务器收到的响应代码是 401 或
    403,那么用于身份验证的寻访令牌或者已过期或无效。
  • 下一步是双重成立访谈令牌(请参阅 事项清单 9)。
  • 得逞再度生成访谈令牌之后,该代码将会更新 OauthDetails bean
    中的访谈令牌值。该代码还有也许会利用新的拜谒令牌值替换 get 方法中幸存的
    Authorization 标头。
  • 该代码今后发生对受保养能源的另三个拜望诉求。
  • 设若访谈令牌有效,况兼财富服务器的 UGL450L
    也是不易的,那么你应该能够在调整台南看看响应内容。

 

用 Salesforce.com 测验客商端

在 Salesforce.com 注册

Salesforce.com 是七个风行的软件即服务 (SaaS卡塔尔国 应用程序,帮衬 OAuth 2.0
的认证码授权类型。

在 Salseforce.com 注册:

  1. 单击 Login,然后单击 Sign up for free
  2. 变成登记,得到你的凭证。
  3. 除去顾客名和密码以外,您还有或许会选择贰个康宁令牌。您为了发出国访问谈令牌央浼而提供的密码必得是你的密码和金昌令牌的串联(举个例子,password12312123)。
  4. 请参阅 参谋资料,从里面黄金年代篇有用的篇章链接中询问哪些在
    salesforce.com 中成立叁个应用程序。
  5. salesforce.com 使用你在应用程序成立进程中钦点的重定向 U帕杰罗I
    与您的认证码授权类型实行通讯。

用 Salesforce.com 运维示例客商端

现今,您曾在 Salesforce 设置了 OAuth 2.0
宽容的服务器,您能够测量试验顾客端并从服务器检索受保险的新闻。

你可以在 Java resources/src 文件夹下找到 Oauth2Client_salesforce.config
文件。这么些构造文件是为 salesforce.com
定制的,能够视作叁个提供配置值的沙盘,以便针对 Salesforce.com 进行测量试验。

如上文所示,在 汤姆cat 服务器上运营 Oauth2Client Web
应用程序,步向测量试验客商端的上马页面,如 图 3 所示。

图 3. Salesforce 测量试验客商端页面

澳门新葡亰平台游戏网站 3

图 3 呈现了测验顾客端页面。单击 Start
Test
 获取访谈令牌。接下来,您会看出 Salesforce
访谈令牌央浼的登入提醒,如 图 4 所示。

图 4. Salesforce 访谈令牌央求(登入提醒)

澳门新葡亰平台游戏网站 4

图 4 展现了 Salesforce 登入页面,从 Salesforce.com 收到 302
和 Location 标头后,顾客端将客户代理(Web浏览器)重定向到该页面。

在签到后,您会看出 Salesforce 访谈令牌哀告开绿灯提示,如 图 5 所示。

图 5. Salesforce 做客令牌诉求(批准提醒)

澳门新葡亰平台游戏网站 5

图 5 呈现能源全数者的认同提醒(登陆后),向 VarunOAuth2.0 App
付与访问权限,该使用是呼吁访谈能源全部者的数据的演示代码。

Salesforce 访谈令牌输出

在 Salesforce
批准提示上对客户端付与访谈权限之后,令牌端点的响应中包涵寻访令牌和刷新令牌,甚至任何
Salesforce 特定的数目。您应该在 Eclipse 调节台窗口中来看输出,如 清单 11
所示。

清单 11. Salesforce 做客令牌输出

点击查阅代码清单

从 Salesforce 服务器检索顾客新闻

当今,您有了拜望令牌,能够发出要求,从 Salesforce
访问能源全部者的帐户新闻,该服务器必要选用 OAuth 2.0 进行身份验证。

用探望令牌和刷新令牌更新 Oauth2Client.confg
文件。还要采用你想测量检验的能源服务器 U景逸SUVL 来安装财富服务器 URubiconL
属性。比方,您能够将其设置为由 Salesforce
作为拜访令牌响应的意气风发有的再次来到的 id 字段。这个 id 字段用于访谈能源全部者的帐户音信(比如,https://login.salesforce.com/id/00D90000000mQaYEAU/00590000001HCB7AAO)。

刷新该项目,并在 汤姆cat 服务器上再也运维该品种。单击 Start
Test
 来访问受保障的能源。

您的 Eclipse 调控台窗口应当显得肖似于 清单 12 的输出。

清单 12. Salesforce 保证的能源输出

点击查看代码清单

如您所见,您能够透过动用 OAuth 2.0 实行身份验证,从 Salesforce
成功访谈财富全部者的帐户消息。在布署文件中提供的拜会令牌过期后,客商端会在下一个诉求中机动重新生成访谈令牌,并利用它来寻觅能源服务器
ULANDL 中提供的受保证财富。

在 Google 注册

Google 使用 OAuth 2.0 对 API 实行身份验证,这个 API 能够用来访谈如
GoogleDrive、TaskQueue 和 CloudSQL
等劳动。依据以下网站的验证,您能够设置一个应用程序,在 谷歌 上测量试验你的
OAuth 2.0
顾客端:。

用 谷歌(GoogleState of Qatar 运转顾客端

当今,您已经设置了 OAuth 2.0
宽容的服务器,您能够测量检验客商端,并从服务器检索受有限支撑的新闻。

您能够在 Java resources/src 文件夹下找到 Oauth2Client_谷歌(GoogleState of Qatar.config
文件。这些结构文件被定制为与 Google服务组合使用,而且能够看作提供配置值的沙盘模拟经营。

在 汤姆cat 服务器上运转 Oauth2Client Web
应用,如前所示。获取访谈令牌操作和寻访受有限支持能源操作的流水生产线和输出如 图 6
所示。

图 6. 拜候令牌央求(登陆提示)

澳门新葡亰平台游戏网站 6

图 6 彰显了 谷歌(Google卡塔尔 登入页面,从 Google 收到 302
和 Location 标头后,顾客端将顾客代理(Web浏览器)重定向到该页面。

图 7 呈现了财富全体者的认同提醒(登入后),向 Cast Iron App
授予访谈权限,该选拔供给访谈财富全数者的多少。

图 7. 拜候令牌央求(批准提醒)

澳门新葡亰平台游戏网站 7

能源全部者对客商端付与访问权限后,令牌端点的响应中蕴藏访谈令牌和刷新令牌。您应该在调整台窗口中看出相似于
项目清单 13 所示的输出。

清单 13.
********** Response Received **********
  expires_in = 3600
  token_type = Bearer
  refresh_token = 1/TtCxaFlKMRsHeIlxrY-2ZJIO8DcRmQEiQ_2Wxw8
  access_token = ya29.ZQDpI-ahF6TMURwAAABqBu-2-U0_lUWfbwh053j3db3PzaNXV4k_k6fc_VT7uQ

从 谷歌(Google卡塔尔(قطر‎ 服务器检索顾客音讯

前日,您有了拜望令牌,能够发出央浼,访谈 GoogleDrive 消息,那要求选拔OAuth 2.0 实行身份验证。

用拜访令牌和刷新令牌更新 Oauth2Client.confg
文件,并应用你希望对其开展测量检验的财富服务器 U福特ExplorerL
来填充财富服务器 url 属性。我要用
替换它,这是 谷歌(Google卡塔尔(قطر‎Drive
帐户信息 U奥德赛L。

当今,刷新该品种,并在 汤姆cat 服务器上再一次运营它。单击 Start
Test
 来访谈受保证的能源。

您应该在调节台窗口中观察相符于 清单 14 的部分。

清单 14.

点击查阅代码清单

如您所见,您能够透过动用 OAuth 2.0 实行身份验证,从 GoogleDrive
成功访问财富全体者的帐户音信。

在安顿文件中提供的探问令牌过期后,客户端会在下二个呼吁中机动重新生成访问令牌,并动用重复生成的采访令牌来寻觅财富服务器
U奥迪Q7L 中提供的受保证能源。

用 IBM 端点来测量检验客户端

顾客端示例代码已经用 OAuth 2.0 包容的 IBM 端点(比方 IBM Websphere®
Application Server 和 IBM DataPower)成功做到了测量试验。®

至于在 Websphere Application Server 上安装 OAuth 2.0
服务器的印证,请参阅 “动用 OAuth:在 WebSphere Application Server
上启用 OAuth
服务提供程序“。

能够应用与在 Salesforce 和 Google 上实行测量试验的如出风华正茂辙方法对 IBM
端点举行测量检验。

结束语

本课程类别的第 3 部降解释了认证码授权类型的底蕴知识。本文演示了如何在
Java 代码中编辑三个通用的 OAuth 2.0 顾客端,以便连接到 OAuth 2.0
包容的四个端点,从中获得受保证的财富。来自 下载 的示范客户端
Web 项目得以导入到 Eclipse
景况中,您能够将此视作三个起源,创制一个定制的 Oauth 2.0 顾客端。

下载

描述 名字 大小
Sample Java code for Authorization code grant type OAuth2.0_AuthCode_part_3.war 25KB
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图