java oauth2.0_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

java oauth2.0

duke-oauth-java-keys

将Google和GitHub OAuth登录添加到Java应用程序的指南

我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰,那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限,许多人都希望使用第三方登录,只要他们要求的权限是非侵入性的-没有人真正希望在Facebook墙上显示随机帖子,因此这种访问方式仅包括用户的基本信息,例如姓名和电子邮件地址。 在本文中,您将初步了解我们如何在Takipi中实现此功能,如何在应用程序中使用3rd party登录,以及我们获得的一些见解,如果您决定集成,则可以节省一些宝贵的时间使用您自己的应用程序。

新帖:如何实现Java OAuth 2.0以使用GitHub和Google登录http://t.co/20Hn59dCtf pic.twitter.com/3tNNwPKjET

— Takipi(@takipid) 2015年5月14日

在我们自己的小宇宙中,事实证明,我并不孤单,许多用户也有同样的感觉。 由于我们是一家开发人员工具初创公司,因此使用GitHub和Google的第三方登录非常合理。 除了为用户提供便利之外,使用第三方服务还可以增强其安全性。 由于Google和GitHub使用双重身份验证(2FA),您的应用程序可以“免费”享受这种安全级别。 在我们的案例中,我们已经启用了2FA,所以我想这使我们……3FA��

带有第3个聚会登录按钮的新主页的样机预览

带有第3个聚会登录按钮的新主页的样机预览

要查看其在实际中的工作方式,您可以查看我们内部用于测试的页面 。 完全可以使用,但是更新尚未在该站点上发布。 您在这里有一个难得的机会成为第一个使用它的人:)

因此,提醒我OAuth 2.0又如何发展?

OAuth登录流程如下:用户访问您的站点,单击“使用任何方式登录”按钮,然后重定向到权限页面。 权限页面来自Whatever™,当他们批准您要求的权限时,Whatever™向他们发送一个令牌,令牌将由他的浏览器发送到您的应用程序的后端。 拥有令牌后,将其发送回Whatever™进行验证并假设它已通过验证–您可以访问被授予权限的数据。

Google OAuth2.0库

为了在我们的网站上实现第三方登录,我们使用了Google APIs Java 客户端库 。 在GitHub顶级Java项目使用的前100个库中 ,还包含Jackson2,ProtoBuf和所有其他方便的实用程序。 对于我们来说,这是一个非常简单的选择,因为我们已经将该库用于其他目的,而且,老实说,谷歌库只是出现在……谷歌上的第一个结果。 准备好您的锡箔帽子 。

使用Google实施登录

这是旅途中的轻松部分; Google的说明文件很明确而且很明确。 由于它是他们自己的库,因此他们还抽象了过程的一部分并在后台对其进行处理,从而使其更易于实现。 第一步是在Google开发人员控制台上创建一个项目,您可以在其中注册应用程序并自定义权限页面。

Google的权限页面–为Takipi定制

Google的权限页面–为Takipi定制

现在回到Java。 从本质上讲,该过程可以简化为几个简单的步骤,不会让人感到意外。 首先,我们构建并执行一个获取GoogleTokenResponse的请求,以便我们可以验证从用户那里获得的令牌。 然后,我们使用此响应来创建一个GoogleCredential ,让我们对其调用getAccessToken()并以JSON格式返回用户的信息:

JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new NetHttpTransport();GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(httpTransport, jsonFactory,/* Client ID and Secret */,code, "postmessage").execute();GoogleCredential credential = new GoogleCredential.Builder().setJsonFactory(jsonFactory).setTransport(httpTransport).setClientSecrets(/* Client ID and Secret */).build().setFromTokenResponse(tokenResponse);Oauth2 oauth2 = new Oauth2.Builder(httpTransport, jsonFactory, credential).setApplicationName("YourAppName").build();
Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(credential.getAccessToken()).execute();return oauth2.userinfo().get().execute();

繁荣。 而已。 最好的建议是仅遵循官方文档。 在GitHub的一端,实现有些棘手。

使用GitHub实施登录

现在,我们意识到Google帮助我们在OAuth方面走了一些弯路,并在GoogleTokenResponse和GoogleCredential中使用了抽象。 使用GitHub,我们必须更接近原始协议。 与Google类似,在GitHub的开发人员应用程序屏幕上注册我们的应用程序时,我们可以自定义权限屏幕 。

GitHub的权限页面–为Takipi定制

当我们到达实际的代码时,有3个主要问题使我们放慢了速度,而在文档中找不到。 解决方法如下:

1.建立自己的请求流程

在Google的情况下,只有5行代码,变成了19行,因此我们可以生成GitHub tokenResponse。 以下是您自己建立请求的方法:

JsonFactory jsonFactory = new JacksonFactory();
HttpTransport httpTransport = new NetHttpTransport();AuthorizationCodeFlow flow = new AuthorizationCodeFlow.Builder(BearerToken.authorizationHeaderAccessMethod(),httpTransport, jsonFactory,new GenericUrl("https://github.com/login/oauth/access_token"),new ClientParametersAuthentication(/* Client ID and Secret */),/* Client ID */"https://github.com/login/oauth/authorize").build();TokenResponse tokenResponse = flow.newTokenRequest(code).setScopes(Collections.singletonList("user:email")).setRequestInitializer(new HttpRequestInitializer() {@Overridepublic void initialize(HttpRequest request) throws IOException {request.getHeaders().setAccept("application/json");}}).execute();

由于某种原因,字符串是默认值

注意到setAccept的更早的初始化方法吗? 这有点令人惊讶。 事实证明,您需要明确要求GitHub以JSON格式返回响应,否则您将以字符串格式获取响应。 如果我们事先知道的话,它可以为我们节省一些时间,例如:

但值得庆幸的是,我们找到了一些胶带和回形针来处理事情

但值得庆幸的是,我们找到了一些胶带和回形针来处理事情

3.处理用于GitHub登录的用户电子邮件

现在,一个GitHub用户可能有多个电子邮件地址,然后您必须选择用于自己目的的电子邮件地址。 因此,我们创建了一个getBestEmail方法,该方法可以对电子邮件数组进行排序(注意,它应该扩展ArrayList才能起作用)。 在对电子邮件数组进行排序之后,我们选择了可以找到的最佳选项:

public class GithubEmails extends ArrayList<GithubEmail> {public GithubEmail getBestEmail() {if (isEmpty()) {return null;}Collections.sort(this, GithubEmail.bestEmailComparator);return get(0);}
}

那么最好的选择是什么? 我们从GitHub的响应中获得的此电子邮件数组中的每个字段都有一封电子邮件,一个经过验证的字段和一个主字段。 这是我们实现的排序比较器:

public static final Comparator<? super GithubEmail> bestEmailComparator =new Comparator<GithubEmail>() {@Overridepublic int compare(GithubEmail o1, GithubEmail o2) {if (o1.verified != o2.verified) {return (o1.verified ? -1 : 1);}if (o1.primary != o2.primary) {return (o1.primary ? -1 : 1);}return o1.email.compareTo(o2.email);}
};

因此,基本上您可以看到我们更喜欢经过验证的电子邮件和主要电子邮件。

结论

我们希望这篇文章可以帮助您将注意力集中在如何通过Google和GitHub的登录方法来访问OAuth和Java上。 虽然这是我们决定实现的方式,但是您可以使用其他方式和库来获得类似的结果。 我们很高兴听到您采用哪种方法,更喜欢哪种库并回答有关此实现的任何问题。 如果您对我们的决定方式有任何意见或建议,请在下面的评论部分中告知我。 而且,如果您遇到麻烦,请分享您遇到的困难,我们将很乐于帮助和分享更多代码。

翻译自: https://www.javacodegeeks.com/2015/05/tutorial-how-to-implement-java-oauth-2-0-to-sign-in-with-github-and-google.html

java oauth2.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337833.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中数组访问越界如何理解

点击上方蓝字关注我&#xff0c;了解更多咨询1、可以通过数组下标直接访问数组中的元素。2、如果一个数组被定义为n个元素&#xff0c;那么访问n个元素是合法的。如果访问n个元素以外&#xff0c;则是非法的&#xff0c;称为访问越界。实例int a[5] {0}; //等价 int a[5] {0,…

c语言中函数是怎么理解?

点击上方蓝字关注我&#xff0c;了解更多咨询1、C语言中的函数是一个可以重复使用的代码&#xff0c;用于独立完成某个功能。2、它可以接收用户传输的参数&#xff0c;也可以不接收&#xff0c;将代码段封装成函数的过程称为函数定义。如果有返回值&#xff0c;使用return语句返…

c语言中函数的声明和定义

点击上方蓝字关注我&#xff0c;了解更多咨询1、函数声明&#xff0c;无需实现该函数的功能。函数声明只是一个空壳&#xff0c;不会有特定的函数实现。2、函数定义&#xff0c;必须实现该函数的功能&#xff0c;要实现函数的实现。#include<stdio.h>实例//使用函数前&am…

c语言中常规函数和指针函数区别

点击上方蓝字关注我&#xff0c;了解更多咨询1、在函数名前面多了一个*号&#xff0c;而这个函数就是一个指针函数。2、其返回值是一个int类型的指针&#xff0c;是一个地址。实例#include<stdio.h>int* fun1(int* x) //传入指针 {int* tmp x; //指针tmp指向xret…

jvm崩溃的原因_JVM崩溃时:如何调查最严重错误的根本原因

jvm崩溃的原因当应用程序崩溃时&#xff0c;您可以学到什么&#xff1f; 我认为&#xff0c;“后见之明是20 /”是最喜欢的短语之一托马斯罗梅尔 &#xff0c;工程ZeroTurnaround的副总裁。 好吧&#xff0c;我实际上不确定在他的短语中占什么位置&#xff0c;但是我已经听过他…

jboss项目导入idea_JBoss BPM Suite快速指南–将外部数据模型导入BPM项目

jboss项目导入idea您正在从事一个大项目&#xff0c;在企业中开发规则&#xff0c;事件和流程以满足关键业务需求。 部分要求指出&#xff0c;某个业务部门将提供您的数据模型供您利用。 不会在JBoss BPM Suite数据建模器中设计此数据模型&#xff0c;但是在从业务中心仪表板…

mysql协议重传,MySQL · 源码分析 · 网络通信模块浅析

MySQL 网络通信浅析MySQL的网络通信协议主要包含以下几个层次&#xff0c;从最上层的MySQL数据包协议层到最底层的socket传输&#xff1a;| THD| Protocol| NET| VIO| SOCKET本文主要扫一下相关的代码&#xff0c;以下分析基于MySQL5.7。创建会话在MySQL5.7中对会话协议层的代码…

C语言代码优化11种实用方法

点击蓝字关注我1、选择合适的算法和数据结构选择一种合适的数据结构很重要&#xff0c;如果在一堆随机存放的数中使用了大量的插入和删除指令&#xff0c;那使用链表要快得多。数组与指针语句具有十分密切的关系&#xff0c;一般来说&#xff0c;指针比较灵活简洁&#xff0c;而…

spring boot注释_使用Spring Boot和注释支持配置Spring JMS应用程序

spring boot注释1.简介 在以前的文章中&#xff0c;我们学习了如何使用Spring JMS配置项目。 如果查看有关使用Spring JMS进行消息传递的文章介绍 &#xff0c;您会注意到它是使用XML配置的。 本文将利用Spring 4.1版本中引入的改进 &#xff0c;并仅使用Java config配置JMS项目…

C语言 | 简单工厂方法模式实现例子

点击蓝字关注我们1、简介简单工厂方法定义一个用于创建对象的类&#xff0c;该类接受一个参数&#xff0c;通过参数决定创建不同的对象。GOF并没有把简单工厂方法定义为23种设计模式之一&#xff0c;可以认为简单工厂方法是工厂方法的简化形式。为了体现简单工厂方法和工厂方法…

C语言 / C++基础面试知识大集合

点击蓝字关注我们相对而言&#xff0c;C语言和C相关的面试题比较少见&#xff0c;没有Java方向写的人那么多&#xff0c;这是一篇 C 语言与 C面试知识点总结的文章&#xff0c;个人感觉非常难得&#xff0c;希望能对大家有所帮助。const作用修饰变量&#xff0c;说明该变量不可…

input发送a.jax_Java REST JAX-RS 2.0 –如何处理日期,时间和时间戳记数据类型

input发送a.jax无论是X-Form-Urlencoded还是JSON HTTP发布到REST资源端点&#xff0c;对于与日期或时间相关的数据都没有特定的“数据类型”。 大多数开发人员会将这些数据发布为“字符串”&#xff0c;或者只是将它们转换为Unix时间戳值&#xff08;例如1435061152&#xff09…

jooq sql_jOOQ星期二:Vlad Mihalcea深入了解SQL和Hibernate

jooq sql欢迎来到jOOQ Tuesdays系列。 在本系列文章中&#xff0c;我们每隔一个月的第三个星期二发布一篇文章&#xff0c;从jOOQ的角度采访我们发现该行业令人兴奋的人。 这包括从事SQL&#xff0c;Java&#xff0c;开放源代码以及各种其他相关主题的人员。 我们很高兴在第三…

C语言灵魂拷问:++i 为比 i++效率高?

点击蓝字关注我们相信很多人遇到过这样的问题&#xff1a;printf("%d,%d",i,i);也纠结过这个问题&#xff0c;到底答案是什么。确没有一个参考的资料。唯一知道的是&#xff0c;几乎所有C语言教材都这么讲&#xff1a;i就是先使用i的值再使i自身加一&#xff0c;而i则…

HibernateNONSTRICT_READ_WRITE CacheConcurrencyStrategy如何工作

介绍 在我以前的文章中 &#xff0c;我介绍了READ_ONLY CacheConcurrencyStrategy &#xff0c;这是不可变实体图的显而易见的选择。 当高速缓存的数据可变时&#xff0c;我们需要使用读写高速缓存策略&#xff0c;本文将介绍NONSTRICT_READ_WRITE二级高速缓存的工作方式。 内…

最全,面中率最高的C++经典面试题分享!

点击蓝字关注我们1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存&#xff0c;new调用构造函数。malloc与free是C/C语言的标准库函数&#xff0c;new/delete是C的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象…

mysql不同版本会覆盖吗,[mysql不同版本数据库同步]mysql数据库主从同步,master和slave上的mysql必须版本一样吗,如果不一样会有什么结果?...

在线QQ客服&#xff1a;1922638专业的SQL Server、MySQL数据库同步软件497950890Slave_SQL_Running: No mysql同步故障解决如果数据不同步可以尝试该资料mysql> show slave status\GSlave_IO_Running: YesSlave_SQL_Running: NoLast_Errno: 1062….Seconds_Behind_Master:NU…

C++ 面试被问到的“左值引用和右值引用”

点击蓝字关注我们1.左值和右值在C11中可以取地址的、有名字的就是左值&#xff0c;反之&#xff0c;不能取地址的、没有名字的就是右值&#xff08;将亡值或纯右值&#xff09;。举个例子&#xff0c;int a bc, a 就是左值&#xff0c;其有变量名为a&#xff0c;通过&a可以…

初学者宝典:C语言入门基础知识大全

点击蓝字关注我们01C语言程序的结构认识用一个简单的c程序例子&#xff0c;介绍c语言的基本构成、格式、以及良好的书写风格&#xff0c;使小伙伴对c语言有个初步认识。例1&#xff1a;计算两个整数之和的c程序&#xff1a;#include main() {int a,b,sum; a20; /*定义变量a,b&a…

qt如何捕获应用程序输出_企业应用程序中需要捕获的5大Java性能指标

qt如何捕获应用程序输出有兴趣了解如何使用AppDynamics捕获这些Java性能指标吗&#xff1f; 立即开始免费试用 &#xff01; 前几篇文章介绍了应用程序性能管理&#xff08;APM&#xff09;&#xff0c;并指出了有效实施APM战略的挑战。 本文通过回顾五个顶级性能指标来构建这…