oauth2_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

news/2024/7/19 14:35:02 标签: java, python, http, php, js
https://img-blog.csdnimg.cn/img_convert/cf9ca7044a417ef199467c30bdfbe944.png" alt="oauth2" width="403px" height="256px" style="outline: none;" />

oauth2

javacodegeeks.com/wp-content/uploads/2015/05/duke-oauth-java-keys.jpg">

duke-oauth-<a class=java-keys" width="300" height="155" style="outline: none;" />

将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的第3方登录非常合理。 除了为用户提供便利之外,使用第三方服务还可以增强其安全性。 由于Google和GitHub使用双重身份验证(2FA),因此您的应用程序可以“免费”享受这种安全级别。 在我们的案例中,我们已经启用了2FA,所以我想这使我们……3FA&#55357;&#56859;

javacodegeeks.com/wp-content/uploads/2015/05/sign-in-with.jpg">
带有第3个聚会登录按钮的新首页的样机预览

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

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

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

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

Google OAuth2.0库

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

使用Google实施登录

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

javacodegeeks.com/wp-content/uploads/2015/05/google-permissions.png">
Google的权限页面–为Takipi定制

Google的权限页面–为Takipi定制

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

java;wrap-lines:false">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。 以下是您自己建立请求的方法:

java;wrap-lines:false">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() {
                   @Override
                   public void initialize(HttpRequest request) throws IOException {
                        request.getHeaders().setAccept("application/json");
                   }
                 }).execute();

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

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

javacodegeeks.com/wp-content/uploads/2015/05/mcgyver-e1431614117554.jpg">
但值得庆幸的是,我们找到了一些胶带和回形针来处理事情

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

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

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

java">public class GithubEmails extends ArrayList<GithubEmail> {
  public GithubEmail getBestEmail() {
    if (isEmpty()) {
      return null;
    }

    Collections.sort(this, GithubEmail.bestEmailComparator);

    return get(0);
  }
}

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

java">public static final Comparator<? super GithubEmail> bestEmailComparator =
    new Comparator<GithubEmail>() {
      @Override
      public 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

oauth2


http://www.niftyadmin.cn/n/1707771.html

相关文章

EXTJS学习笔记

sencha which set PATH%PATH%;C:\Sencha\Cmd\6.0.0.92 sencha generate app --ext MyApp ./myapp 将会创建名为 MyApp 的 Ext JS 应用&#xff0c;应用所有的文件都放在 当前目录下名为 myapp 的文件夹。 extjs 1.基本结构: Ext.define(‘Car’,{ name:null, constructor:…

输入捕获_企业应用程序中要捕获的5大Java性能指标

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

lambda表达式_Lambdas中的例外:有点混乱的优雅解决方案

lambda表达式考虑以下用于写入文件的功能&#xff1a; 该方法背后的想法是&#xff0c;以允许用户在不同的实施方式中通过InputStream的方法&#xff0c;以便writeToFile可以被称为例如用GZIPOuputStream &#xff0c; SnappyOuputStream(快速压缩)或简单的FileInputStream 。 …

页面跳转_跳转到企业缓存之前要考虑的事情

页面跳转介绍 关系数据库事务是ACID &#xff0c;强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置&#xff0c;因此&#xff0c;只要数据访问层开始出现性能问题&#xff0c;就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性能&#xff0c;但是…

dojo目录树_我的Dojo中有一个Mojo(如何编写Maven插件)

dojo目录树我一直忙于在工作中使用Maven的腋窝。 对于很多开发人员&#xff0c;我会听到&#xff1a;“那又怎样。” 所不同的是&#xff0c;我通常在无法直接访问Internet的环境中工作。 因此&#xff0c;当我说我经常使用Maven时&#xff0c;这意味着某些事情。 依赖地狱 公平…

java安装_每个Java开发人员都必须避免的9个安全错误

java安装Checkmarx CxSAST是功能强大的源代码分析(SCA)解决方案&#xff0c;旨在从根本上识别&#xff0c;跟踪和修复技术和逻辑安全漏洞&#xff1a;源代码。 在这里查看&#xff01; 自从1995年中期引入Java以来​​&#xff0c;它已经走了很长一段路。 它的跨平台特性使其成…

异常--org.jdom.JDOMException: java.lang.NoSuchMethodError: org.jaxen.BaseXPath.init

异常截图 解决方案 创建类XPath对象失败,没有找到org.jaxen.BaseXPath这个类经过排查发现dom4j的jar包和jdom的jar包同时包含org.jaxen.BaseXPath; 查询资料发现类加载是—谁在前面就先加载谁&#xff0c;不会覆盖修改pom文件中jar包位置,恢复正常

阿里java面试题

1、线程怎么保持同步 使用synchronized关键字同步方法或代码 2、spring中bean的周期是怎样的 1&#xff1a;两个类如何产生关系 2&#xff1a;java把一个文件的内容复制到另外一个文件上 3、给了一个场景&#xff0c;在一个数组中怎么找出两个相加是是10的数&#xff08;这题不…