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,一经查实,立即删除!

相关文章

ViewPager使用笔记

1.ViewPager.setCurrentItem(position)&#xff0c;即使已设置动画&#xff0c;但是没有动画效果 原因&#xff1a;因为ViewPager滑动之前的时间间隔太短&#xff0c;可以通过反射&#xff0c;去修改ViewPager自动滑动时间&#xff0c;代码实现如下 1 public class ViewPagerSc…

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系统做支持…

Apache CXF负载平衡和故障转移

前一段时间&#xff0c;我们已经面临基于Apache CXF的负载平衡Web服务客户端的需求。 此外&#xff0c;当某些服务器关闭时&#xff0c;客户端应自动进行故障转移。 更糟糕的是&#xff0c;服务器目标地址列表要从外部服务获取并在运行时更新。 最终&#xff0c;我们最终获得了…

PAT-BASIC-1038-统计同成绩学生

本题要求读入N名学生的成绩&#xff0c;将获得某一给定分数的学生人数输出。 输入格式&#xff1a; 输入在第1行给出不超过105的正整数N&#xff0c;即学生总人数。随后1行给出N名学生的百分制整数成绩&#xff0c;中间以空格分隔。最后1行给出要查询的分数个数K&#xff08;不…

JavaScript事件处理的三种方式(转)

一、什么是JavaScript事件&#xff1f;事件(Event)是JavaScript应用跳动的心脏&#xff0c;也是把所有东西粘在一起的胶水&#xff0c;当我们与浏览器中Web页面进行某些类型的交互时&#xff0c;事件就发生了。 事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键…

Xuggler教程:转码和媒体修改

注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 在之前的教程中&#xff0c;我对视频处理Xuggler进行了简短介绍 。 在这一部分中&#xff0c;我们将看到Xuggler和FFmpeg提供的一些更令人兴奋的功能&#xff0c;例如视频转码和媒体修改。 不要忘记Xuggler是一…

Web工程师必备的43款可视化工具

国外站点DATAVISUALIZATION.CH为大家总结出了当前热用的43款可视化工具&#xff0c;包括Arbor、Chroma.js、D3.js、Google Chart Tools等&#xff0c;绝对让你一饱眼福。 1.Arbor.js Arbor是一个免费的、可视化的图形库&#xff0c;基于矢量创建动态的连接图。它为图形组织和屏…

力扣7. 整数反转

方法一&#xff1a;官方给的&#xff0c;自己懂了后照着敲了一遍 class Solution {public int reverse(int x) {int rev 0;while (x ! 0) {//if判断条件过于复杂&#xff0c;我好不容易看懂了if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {retu…

AndroidManifest.xml中的application中的name属性

被这个不起眼的属性折磨了一天&#xff0c;终于解决了。 由于项目需要&#xff0c;要合并两个android应用&#xff0c;于是拷代码&#xff0c;拷布局文件&#xff0c;拷values&#xff0c;所有的都搞定之后程序还是频频崩溃&#xff0c;一直没有找到原因&#xff0c;学android…

在域驱动设计中使用状态模式

域驱动设计&#xff08;DDD&#xff09;是一种软件开发方法&#xff0c;其中&#xff0c;通过将实现与核心业务概念的不断发展的模型相连接&#xff0c;可以解决问题的复杂性。 该术语是由Eric Evans创造的&#xff0c;并且有一个DDD专用站点可以促进其使用。 根据其定义&#…

Java Fork / Join进行并行编程

最近几年&#xff0c;计算机处理器领域发生了范式转变。 多年来&#xff0c;处理器制造商一直在提高时钟频率&#xff0c;因此开发人员享受到这样的事实&#xff0c;即他们的单线程软件执行得更快&#xff0c;而无需他们付出任何努力。 现在&#xff0c;处理器制造商青睐多核芯…

arm-elf-gcc交叉编译器的使用教程

arm-elf-gcc交叉编译器的使用教程 一开始需要安装arm-elf-gcc&#xff0c;但是这是一个32位的程序&#xff0c;我是安装了64位的系统&#xff0c;据说安装ia32.libs依赖库能运行这个&#xff0c;但是看到博客上面前人安装完了系统图标少了一半&#xff0c;然后就怕了。经过了翻…

程序员需要谨记的九大安全编码规则

历史已经证明&#xff0c;软件设计的缺陷一直是导致其漏洞被利用的最主要的罪魁祸首。安全专家发现&#xff0c;多数漏洞源自常见软件中相对有限的一些漏洞。软件开发者和设计者应当严格检查程序中的各种错误&#xff0c;尽量在软件部署之前就减少或清除其中的漏洞。 下面列举的…

力扣合并两个有序数组

题目&#xff1a;给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#…

单调栈3_水到极致的题 HDOJ4252

A Famous City 题目大意 给出正视图 每一列为楼的高度 最少有几座楼 坑点 楼高度可以为0 代表没有楼 贡献了两发RE 原因 if(!s.empty()&&tem){s.push(tem); continue;}并不能筛去 空栈且 tem为0的情况 改为 if(!s.empty()){if(tem) s.push(tem); continue;} 后AC 题目…

力扣两数之和 II - 输入有序数组

题目:给定一个已按照 非递减顺序排列 的整数数组 numbers &#xff0c;请你从数组中找出两个数满足相加之和等于目标数 target 。 我的代码&#xff1a; 对撞指针 class Solution {public int[] twoSum(int[] numbers, int target) {int low 0;//指向头int high numbers.le…

[团队项目3.0]Scrum团队成立

Scrum团队成立 5.Scrum团队成立 5.1 团队名称&#xff0c;团队目标、团队口号、团队照&#xff1b; 5.2 角色分配 产品负责人: 决定开发内容和优先级排序&#xff0c;最大化产品以及开发团队工作的价值。 Scrum Master&#xff1a; 负责确保团队遵循 Scrum 的理论、实践和规则。…

Character.isLetterOrDigit(ch)判断ch是否为字母或数字

Character.isLetter(ch) 判断ch是否为字母 Character.isDigit(ch) 判断ch是否为数字 Character.isLetterOrDigit(ch) 判断ch是否为字母或数字 /* 例子*/char ch q;System.out.println(Character.isLetter(ch));System.out.println(Character.isDigit(ch));System.out.print…

高级SmartGWT教程,第1部分

贾斯汀&#xff08;Justin&#xff09;&#xff0c;帕特&#xff08;Pat&#xff09;和我已经开始着手一个需要用户界面进行管理和管理的副项目。 在与SmartGWT和GWT共同工作了一段时间之后&#xff0c;我们决定使用SmartGWT创建接口。 我们非常喜欢视觉组件&#xff08;请查看…

Linux Mint---ATI显卡驱动安装篇

显卡驱动可谓是至关重要&#xff0c;当时折腾debian驱动的时候可是弄了好几天才搞定的&#xff0c;现在却非常容易就是装上&#xff0c; 详见这篇博客&#xff1a;http://www.yyearth.com/article/14-03/amd13.html 在此表示感谢&#xff01; 我的話&#xff0c;全在圖形界面下…