热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java实现GitHub第三方登录详解

GitHub第三方登录实现效果如下:实现流程如下:1.注册一个GitHub账号2.注册一个授权的网站保存一个你的ClientID和ClientSecr

GitHub第三方登录实现效果如下:

实现流程如下:

1.注册一个GitHub账号
2.注册一个授权的网站保存一个你的Client IDClient Secret
3.准备一个页面,有一个链接跳转到授权的页面https://github.com/login/oauth/authorize?client_id=xx&state=STATE&redirect_uri=xx">GitHub登录
4.准备controller去处理callback回调的请求① 获取到请求参数中的code② 拿到code去发送请求请求token③ 拿到token发送请求请求用户信息④ 将用户信息做持久化处理(放到请求范围中)⑤ 在主页面通过el表单获取到前面取到的用户信息...

OAuth2.0的认证原理

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写,目前的版本是2.0版。  https://oauth.net/2/ 

GitHub第三方登录的认证授权流程

申请 Client ID 和 ClientSecret

首先到GitHub官网注册账号: https://github.com/

登录:https://github.com/login

登录进去之后点击你的头像,选择Settings

选择左下方的Developer settings创建一个应用

注册应用之后,可以获取到 Client ID 和 Client Secret  

申请clientID和clientSecret的用途???

clientID:应用的唯一标识。

clientSecret:clientID对应的密钥,访问用户资源时用来验证应用的合法性。

申请地址: https://github.com/settings/developers

注意:clientIDclientSecret信息进行保密,不要随意泄漏。

GitHub的登录授权实现

第三方登录流程是:先获取code --> 然后获取access_token --> 根据token获取用户信息。

前台页面实现步骤:点击登录按钮 --> 打开一个窗口,进行授权 --> 授权完成,跳转到首页或上次浏览的页面。

前台准备一个页面,有一个链接跳转到GitHub的授权页面

https://github.com/login/oauth/authorize?client_id=xx&state=xx&redirect_uri=xx;

点击跳转到GitHub第三方登录页面

登录账号进行授权

授权之后就会跳转到自己之前创建应用时设置的回调路径

温馨小提示:如果是本地测试可将回调地址修改成本地路径

温馨小提示:可在GitHub上 https://github.com/settings/applications 取消授权的应用

登录就算完成了,那么我们怎么去获取用户信息来实现我们的其他功能呢??比如获取用户账号,头像等信息绑定到自己系统的数据库里面

代码实现   (温馨小提示:这里我将代码都一个文件了,有3个类,需要自己弄出来哦)

package com.zhengqing.web.controller;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;@Controller
public class GitHubCallBackController {//授权成功后的回调,我们需要在这个方法中拿到code去请求token@RequestMapping("/callback")public String callback(String code, String state) throws Exception{//获取到code和stateSystem.out.println("code:"+code);System.out.println("state:"+state);if(!StringUtils.isEmpty(code)&&!StringUtils.isEmpty(state)){//拿到我们的code,去请求token//发送一个请求到String token_url = GitHubConstants.TOKEN_URL.replace("CLIENT_ID", GitHubConstants.CLIENT_ID).replace("CLIENT_SECRET", GitHubConstants.CLIENT_SECRET).replace("CALLBACK", GitHubConstants.CALLBACK).replace("CODE", code);
// System.out.println("用户信息数据"+token_url);//这个里面有我们想要的用户信息数据String responseStr = HttpClientUtils.doGet(token_url);String token = HttpClientUtils.parseResponseEntity(responseStr).get("access_token");//根据token发送请求获取登录人的信息String userinfo_url = GitHubConstants.USER_INFO_URL.replace("TOKEN", token);responseStr = HttpClientUtils.doGet(userinfo_url);//jsonMap responseMap = HttpClientUtils.parseResponseEntityJSON(responseStr);System.out.println("登录用户信息:"+responseMap);//responseMap里面保存着用户登录信息System.out.println("获取登录用户的用户名:"+responseMap.get("login"));}return "main";// TODO 修改成自己需要返回的页面...}
}
//抽取出来的参数【代码拷贝下来只需要修改成自己的CLIENT_ID,Client CLIENT_SECRET,CALLBACK即可】
class GitHubConstants {public static final String CLIENT_ID = "xx"; // TODO 修改成自己的public static final String CLIENT_SECRET = "xx"; // TODO 修改成自己的public static final String CALLBACK = "xx"; // TODO 修改成自己的 [注意:callback要和注册的回调路径保持一致 否则登录授权之后会报NullPointerException]//获取code的urlpublic static final String CODE_URL = "https://github.com/login/oauth/authorize?client_id=CLIENT_ID&state=STATE&redirect_uri=CALLBACK";//获取token的urlpublic static final String TOKEN_URL = "https://github.com/login/oauth/access_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&code=CODE&redirect_uri=CALLBACK";//获取用户信息的urlpublic static final String USER_INFO_URL = "https://api.github.com/user?access_token=TOKEN";
}
//工具类
class HttpClientUtils {/*** 使用HttpClient发送一个Get方式的请求* &#64;param url 请求的路径 请求参数拼接到url后面* &#64;return 响应的数据* &#64;throws Exception*/public static String doGet(String url)throws Exception{CloseableHttpClient httpclient &#61; HttpClients.createDefault();HttpGet httpGet &#61; new HttpGet(url);CloseableHttpResponse response &#61; httpclient.execute(httpGet); //发送一个http请求//如果响应成功,解析响应结果if(response.getStatusLine().getStatusCode()&#61;&#61;200){HttpEntity responseEntity &#61; response.getEntity(); //获取响应的内容return EntityUtils.toString(responseEntity);}return null;}// 参数的封装public static Map parseResponseEntity(String responseEntityStr){Map map &#61; new HashMap<>();String[] strs &#61; responseEntityStr.split("\\&");for (String str : strs) {String[] mapStrs &#61; str.split("&#61;");String value &#61; null;String key &#61; mapStrs[0];if(mapStrs.length>1){value &#61; mapStrs[1];}map.put(key, value);}return map;}//json字符串转mappublic static Map parseResponseEntityJSON(String responseEntityStr){Map map &#61; new HashMap<>();JSONObject jsonObject &#61; JSONObject.parseObject(responseEntityStr); //解析json格式的字符串Set> entries &#61; jsonObject.entrySet();for (Map.Entry entry : entries) {String key &#61; entry.getKey();String value &#61; String.valueOf(entry.getValue());map.put(key, value);}return map;}}

maven项目中还需要额外引入如下&#xff0c;其余的就是自己项目的配置&#xff0c;比如上面的代码是springmvc配置通过 &#64;Controller 进行跳转...

org.apache.httpcomponentshttpclient4.5.6com.alibabafastjson1.2.47

 

可直接拷贝到自己的项目中使用哦&#xff0c;注意修改以下部分哦

以及注意这个 responseMap 里面封装了我们想要的用户信息数据哦

ex&#xff1a;repos_url里面有很多我们想要的数据   

代码最后运行结果&#xff1a; 可根据自己的需求去拿数据

 


推荐阅读
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文介绍了Windows Vista操作系统中的用户账户保护功能,该功能是为了增强系统的安全性而设计的。通过对Vista测试版的体验,可以看到系统在安全性方面的进步。该功能的引入,为用户的账户安全提供了更好的保障。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 解决IDEA配置xml文件头报错的方法
    本文介绍了解决IDEA配置xml文件头报错的方法,包括了具体的解决方案和步骤。通过本文的指导,读者可以轻松解决这个问题并正常使用IDEA进行开发工作。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
mobiledu2502878243
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有