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.mzph.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…