Java中的Google ClientLogin實用程序

Google API的身份驗證和授權是當今需要與Google服務集成和信息交換的應用程序中的常見功能。 盡管大多數Google身份驗證過程是針對Web應用程序量身定制的,但它也可用于桌面和已安裝的應用程序。 對于桌面應用程序,Google建議使用稱為ClientLogin的身份驗證方法。

值得一提的是,當應用程序與受保護數據的所有者之間存在高度信任時,可以使用ClientLogin。 通常建議在應用程序擁有受保護數據的情況下使用。

ClientLogin方法主要通過使用Google文檔中所述的特定參數將HTTP Post請求發送到Google服務來工作。 在本文中,我們將使用另一種方法來實現ClientLogin授權過程。 我們將使用Google APIs Java客戶端庫 ,這是一個功能強大的Java庫,用于訪問網絡上Google基于HTTP的API。 顯然,該庫中最重要的類是ClientLogin類。

ClientLogin類的1-解剖:

ClientLogin類提供單個方法authenticate(),該方法處理身份驗證過程的詳細信息。 它還提供了一個重要的內部類ErrorInfo,可用于處理身份驗證錯誤和驗證碼質詢邏輯。

在這篇文章中,我們為ClientLogin提供了一個干凈的包裝類,它處理完整的ClientLogin授權過程,包括身份驗證錯誤解析和驗證碼質詢處理。

2-google-api-java-client Maven依賴關系:

我們選擇使用maven構建我們的項目示例。 Maven為Java的Google API客戶端庫提供了相關性。 只需將以下maven依賴項添加到pom.xml文件中:

<dependency><groupId>com.google.api.client</groupId><artifactId>google-api-client-googleapis-auth-clientlogin</artifactId><version>1.2.3-alpha</version>
</dependency>
<dependency><groupId>com.google.api.client</groupId><artifactId>google-api-client-javanet</artifactId><version>1.2.3-alpha</version>
</dependency>

之后,使用maven:install安裝所需的jar,使其包含在我們的項目類路徑中。

3-GoogleClientLogin包裝器類:

我們的包裝器類顯然包含對ClientLogin的引用。 它提供了實現身份驗證過程重要功能的公共方法。

GoogleClientLogin具有一個構造函數,該構造函數接受一個String,該String表示您請求其授權的Google服務(例如,Google Calendar的“ cl”)。 構造函數如下所示:

/**
* @param service
*/
public GoogleClientLogin(String service) {super();this.service = service;authenticator = new ClientLogin();transport = GoogleTransport.create();authenticator.authTokenType = service;
}

主要方法是authenticate(username,password),它采用兩個參數表示用戶輸入的用戶名和密碼:

/**
* @param username
* @param password
* @throws ClientLoginException
*/
public void authenticate(String username, String password)throws ClientLoginException {try {// authenticate with ClientLoginauthenticator.username = username;authenticator.password = password;Response response = authenticator.authenticate();this.authToken = response.auth;} catch (HttpResponseException e) {parseError(e);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

此方法設置ClientLogin變量(用戶名和密碼),然后調用ClientLogin.authenticate(),該響應返回一個Response實例。 如果ClientLogin.authenticate()調用成功,我們將存儲身份驗證令牌'Response.auth'。 authenticate(username,password)包裝器方法的優點是對身份驗證錯誤的智能處理。

解析身份驗證錯誤:

我們區分在調用Clientlogin.authenticate()期間可能引發的兩個錯誤類別:

我們使用ClientLoginException類的一個不可恢復的錯誤
當Google服務需要驗證碼挑戰時引發的ba可恢復錯誤。

稍后,我們使用一個單獨的Exception類CaptchaRequiredException,它擴展了第一個ClientLoginException類。

如果身份驗證響應包含錯誤代碼,則Clientlogin.authenticate()會引發HttpResponseException。 我們提供了一個用于解析此異常類的輔助方法,如下所示:

/*** @param e* @throws ClientLoginException*/
private void parseError(HttpResponseException e)throws ClientLoginException {try {ClientLogin.ErrorInfo errorInfo = e.response.parseAs(ClientLogin.ErrorInfo.class);errorMessage = errorMsg.get(errorInfo.error);if (errorInfo.error.equals(CaptchaRequired)) {captchaToken = errorInfo.captchaToken;captchaUrl = errorInfo.captchaUrl;throw new CaptchaRequiredException(errorMessage, e);} elsethrow new ClientLoginException(errorMessage, e);} catch (IOException e1) {throw new ClientLoginException(e1);}
}

我們調用HttpResponseException.response.parseAs(ClientLogin.ErrorInfo.class)來解析響應。 如果錯誤代碼為“ CaptchaRequired”,則我們將存儲errorInfo.captchaToken和errorInfo.captchaUrl,然后拋出CaptchaRequiredException。 對于其余的錯誤代碼,我們只拋出ClientLoginException。

驗證碼驗證

對于驗證碼質詢,我們提供了第二個authenticate()方法,該方法提供一個額外的參數“ captchaAnswer”,表示用戶在驗證碼質詢期間輸入的驗證碼密鑰:

/*** @param username* @param password* @param captchaAnswer* @throws ClientLoginException*/
public void authenticate(String username, String password,String captchaAnswer) throws ClientLoginException {authenticator.username = username;authenticator.password = password;authenticator.captchaToken = this.captchaToken;authenticator.captchaAnswer = captchaAnswer;try {Response response = authenticator.authenticate();this.authToken = response.auth;} catch (HttpResponseException e) {parseError(e);} catch (IOException e) {throw new ClientLoginException(e);}
}

在調用authenticator.authenticate()之前,此方法設置兩個額外的字段authenticator.captchaToken和authenticator.captchaAnswer。 此方法的錯誤處理與主要的authenticate(username,password)方法相同。

最后,我們提供了一種檢索將顯示給用戶的驗證碼圖像的方法:

/*** @return the captchaImage*/
public BufferedImage getCaptchaImage() {BufferedImage image = null;try {URL url = new URL("https://www.google.com/accounts/"+ getCaptchaUrl());image = ImageIO.read(url);} catch (MalformedURLException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();return null;}return image;
}

您可以在此處查看完整的GoogleClientLogin類源文件。

4-測試GoogleClient包裝器類

GoogleClientLoginDialog是一個擺動對話框,其中提供了有關如何使用GoogleClientLogin包裝器類的示例。 它提供了強制Google服務發送驗證碼挑戰的功能。 我們使用一個線程來執行此測試,該線程一直發送隨機密碼,直到Google響應驗證碼為止:

private class ForceCaptchaRunnable implements Runnable{public void run() {Random r = new Random();boolean isCaptcha = false;while (!isCaptcha) {try {client.authenticate(textField.getText().trim(),passwordField.getText().trim()+ r.nextInt(100));showMessage("Auth Token: "+client.getAuthToken());} catch (CaptchaRequiredException e1) {isCaptcha = true;showCaptcha(true);} catch (ClientLoginException e1) {}}}}

您可以查看和下載此示例項目Google代碼項目的完整源代碼: google-apis-utils 。

參考: Othman博客上我們JCG合作伙伴 Othman El Moulat的Java版Google ClientLogin實用程序 。

相關文章 :

  • YouTube Java API入門
  • Google Guava庫必需品
  • Java Code Geeks Andygene Web原型
  • 使用Spring Security保護GWT應用程序

翻譯自: https://www.javacodegeeks.com/2011/09/google-clientlogin-utility-in-java.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374795.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374795.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374795.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

九度OJ1486 /POJ 1029/2012北京大學研究生復試上機

wa到死&#xff01;wa到死&#xff01;這是一個看著簡單&#xff0c;坑及其多的題&#xff01; 坑一&#xff1a;POJ上是單組輸入&#xff0c;九度上是多組輸入&#xff0c;媽蛋要是研究生復試遇到這種大坑肯定死掉啊&#xff01;而且對于codeforces比較習慣的 同學肯定會覺得巨…

P1046 [NOIP2005 普及組] 陶陶摘蘋果

題目描述 陶陶家的院子里有一棵蘋果樹&#xff0c;每到秋天樹上就會結出 1010 個蘋果。蘋果成熟的時候&#xff0c;陶陶就會跑去摘蘋果。陶陶有個 3030 厘米高的板凳&#xff0c;當她不能直接用手摘到蘋果的時候&#xff0c;就會踩到板凳上再試試。 現在已知 1010 個蘋果到地面…

新手不了解Xcode和mac系統可能犯得錯誤和我的建議

我是學iOS剛入門的新手&#xff0c;本人裝的時黑蘋果&#xff0c;我是喜歡完美的人&#xff0c;但黑蘋果又是不完美的系統&#xff0c;比如關不了機啊&#xff0c;和顯卡驅動不了啊&#xff0c;當自己的電腦出現白屏和卡頓的時候氣的沒脾氣。我是一個新手。開始學的時java但我喜…

改善Java應用程序性能的快速技巧

曾經遇到過性能問題嗎&#xff1f; 我也是。 如果我的經理再喊一次“ faaaaster”&#xff0c;我一生都會有聽力障礙。 順便說一句&#xff0c;我能聽到所有聲音中的德語發音嗎&#xff1f; ;-) 您可以相信仍然有人無知地在談論垃圾收集器&#xff08;得到它嗎&#xff1f;&…

P1047 [NOIP2005 普及組] 校門外的樹

某校大門外長度為 ll 的馬路上有一排樹&#xff0c;每兩棵相鄰的樹之間的間隔都是 11 米。我們可以把馬路看成一個數軸&#xff0c;馬路的一端在數軸 00 的位置&#xff0c;另一端在 ll 的位置&#xff1b;數軸上的每個整數點&#xff0c;即 0,1,2,\dots,l0,1,2,…,l&#xff0…

團隊開發——個人工作總結04

昨天對要用到的SQL語句進行了研究&#xff0c;分別得到了以下結果&#xff1a; 1.這段語句是為用戶登錄服務的&#xff0c;通過JSP的到的用戶名username和密碼passdword作為條件查詢數據庫&#xff0c;如果有查詢結果&#xff0c;則返回true select * from [login] where usern…

Nginx的幾種常見的幾種啟動方式

1.默認方式啟動 直接執行Nginx的二進制文件即可 /usr/local/nginx/sbin/nginx 這時默認讀取配置文件&#xff0c;配置文件目錄 /usr/local/nginx/conf/nginx.conf 2.指定配置文件的啟動方式 /usr/local/nginx/sbin/nginx -c /tmp/nginx.conf轉載于:https://www.cnblogs.com/Leo…

yii2閱讀隨筆14

繼續來看Event.php /*** Triggers a class-level event.* 觸發類級別事件。* This method will cause invocation of event handlers that are attached to the named event* for the specified class and all its parent classes.* 觸發某個類或者對象的某個事件* param strin…

P1059 [NOIP2006 普及組] 明明的隨機數

題目描述 明明想在學校中請一些同學一起做一項問卷調查&#xff0c;為了實驗的客觀性&#xff0c;他先用計算機生成了N個1到1000之間的隨機整數(N≤100)&#xff0c;對于其中重復的數字&#xff0c;只保留一個&#xff0c;把其余相同的數去掉&#xff0c;不同的數對應著不同的學…

基本的EJB參考,注入和查找

在本系列的第一部分中 &#xff0c;我們介紹了Enterprise JavaBeans v。3.0規范提供的機制&#xff0c;用于定義EJB組件&#xff0c;聲明對EJB的引用并通過依賴項注入或程序化JNDI查找將它們連接起來。 在此博客文章中&#xff0c;我們將研究一些基本示例以了解如何使用EJB API…

ViewPager使用筆記

1.ViewPager.setCurrentItem(position)&#xff0c;即使已設置動畫&#xff0c;但是沒有動畫效果 原因&#xff1a;因為ViewPager滑動之前的時間間隔太短&#xff0c;可以通過反射&#xff0c;去修改ViewPager自動滑動時間&#xff0c;代碼實現如下 1 public class ViewPagerSc…

IOS開發之Swift學習筆記

1.因為存儲屬性要求初始化&#xff0c;我們可以使用lazy修飾符來延遲初始化。轉載于:https://www.cnblogs.com/luntai/p/5430223.html

力扣1兩數之和

給定一個整數數組 nums 和一個整數目標值 target&#xff0c;請你在該數組中找出 和為目標值 target 的那 兩個 整數&#xff0c;并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案。但是&#xff0c;數組中同一個元素在答案里不能重復出現。 你可以按任意順序返回…

C ++或Java,高頻交易哪個更快?

總覽 關于什么是高頻交易的最佳解決方案&#xff0c;存在不同意見。 問題的一部分是高頻交易的變化超出您的預期&#xff0c;另一部分是更快的含義。 我的看法 如果您有一個典型的Java程序員和一個典型的C 程序員&#xff0c;并且每個人都有幾年編寫典型的面向對象程序的經驗…

iOS 8 Xcode6 設置Launch Image 啟動圖片

本人apem http://www.mamicode.com/info-detail-494411.html 如何設置App的啟動圖,也就是Launch Image? Step1 1.點擊Image.xcassets 進入圖片管理,然后右擊,彈出"New Launch Image"2.如圖,右側的勾選可以讓你選擇是否要對ipad,橫屏,豎屏,以及低版本的ios系統做支持…

代碼分享h5-sessionStorage,提示app下載代碼塊

1.html <div class"down-app">    <span id"dowm-close">x</span>    <dl>      <dt>logo</dt>      <dd>        <h3>某某公司</h3>        <p>某某公…

Apache CXF負載平衡和故障轉移

前一段時間&#xff0c;我們已經面臨基于Apache CXF的負載平衡Web服務客戶端的需求。 此外&#xff0c;當某些服務器關閉時&#xff0c;客戶端應自動進行故障轉移。 更糟糕的是&#xff0c;服務器目標地址列表要從外部服務獲取并在運行時更新。 最終&#xff0c;我們最終獲得了…

Java局部變量一定要賦初值

根據大佬文章https://blog.csdn.net/wjw521wjw521/article/details/79243596的理解而寫的 1.類成員變量在 類加載 時會被系統賦初值&#xff0c;比如定義一個整型變量int num 系統默認num值為0 2.但是方法內的局部變量執行進棧操作&#xff0c;這個過程中系統不會賦初值&…

隱式的類類型轉換

如果構造函數只接受一個實參&#xff0c;則它實際上定義了轉換為此類類型的隱式轉換機制。將這種構造函數稱為轉換構造函數。 #ifndef MAIN_H_INCLUDED#define MAIN_H_INCLUDED#include<iostream>usingnamespace std;classClassTest{public:ClassTest(){ cout <<&q…

負數的 %求余和取模

1.求余和取模是不同的 2.‘%’ 在C/C&#xff0c;Java等語言中意為 求余 &#xff0c;在python 中意為 取模 3.a%b c 求余: c的符號和a一致 取模&#xff1a;c的符號和b一致 比如&#xff0c;一個小李子&#xff1a; public class Solution{public static void main(String…