笔者第一次写网站只写了接收参数以及登录页面就兴奋了一整天,还特意地加上了第三方登录,想起当时的情景还历历在目。之前是照着被人的博客一步步完成第三方登录的功能,现在就要自己来理解完成了

1. OAuth 2.0

第三方登录需要用到OAuth 2.0的原理,那么我们得先了解其原理,然后再讲解第三方登录就会简单很多,后面会有具体实例与代码

OAuth 2.0是一种规范的授权机制,主要用来颁发令牌的,根据其规范可分为两个角色:客户端与资源所有者,资源所有者同意客户端访问后就会向其颁发令牌,客户端携带令牌去请求客户的数据。总结一句:资源所有者向第三方应用颁发令牌。

OAuth 2.0 规定了四种获得令牌的流程

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

下面主要讲解广泛使用的 授权码(authorization-code) 方式

流程:

步骤一:第三方网站A 提供其他登录方式B 的链接,用户点击后会跳转到网站B。用户在跳转的网站B 登录后,会携带上授权码(code)跳回网站A

步骤二:网站A 拿到授权码(code)后,会在后端携带网站注册信息以及上面获取的授权码(code)向网站B 请求令牌(Token)

步骤三:网站B 收到令牌的请求并验证通过后,会向网站A 发送令牌(Token)

步骤四:网站A 获取到令牌(Token)后,就可以携带上令牌(Token)向网站B 请求用户数据了

2.前提准备

Github操作比较容易,不像微信QQ等流程较为麻烦,下面具体内容参考 Github Apps

  • Github账号
  • 公网IP或域名
  • 登录页面

3. 创建Github应用

其中授权回调地址的例子:http://localhost:8080/oauth/redirect (localhost要填写公网IP或域名),注册应用之后Github会给你 Client IDClient Secret,记住他俩后面会用到

4. 请求用户的GitHub身份

第三方网站A 提供跳转的链接(当然可以设置成图标形式,下图是笔者第一次写的网站)

GET https://github.com/login/oauth/authorize?client_id=XXXXXXXXXXX

该地址带上了参数 client_id 就是步骤2.0中让你记住的Id

代码例子

<a href="https://github.com/login/oauth/authorize?client_id=XXXXXXXX">Github第三方登录</a>

5. GitHub将用户重定向回您的站点

用户登录后Github将重定向回步骤3 填的回调地址,并带上了10分钟有效期的临时授权码(code),该授权码的接收参数为code。第三方网站获取到授权码后带上网站注册信息和授权码去交换令牌(Token)

重定向的地址例子,从中可获取code

http://127.0.0.1:8080/oauth/redirect?code=7647753523ada28dfabc

代码例子

@RestController
@RequestMapping("/oauth")
public class OAuthController { @GetMapping("/redirect")
public String redirect(String code){
// 这样就获取到code了
System.out.println(code);
}
}

然后我们就携带下面的三个参数去POST请求下面的地址

POST https://github.com/login/oauth/access_token
名称 类型 描述
client_id string 您从GitHub收到的GitHub App的客户端ID
client_secret string 您从GitHub收到的GitHub App的客户密码
code string 您上面收到的授权码(code)

代码例子

笔者使用SpringBoot自带的RestTemplate模板去使用Http

// 请求地址
String url = "https://github.com/login/oauth/access_token"; // POST参数必须用这个
MultiValueMap<String,String> paramMap = new LinkedMultiValueMap();
paramMap.add("client_id","XXXXXXXXXXXXXXX");
paramMap.add("client_secret","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
paramMap.add("code",code); // 发送请求
RestTemplate restTemplate = new RestTemplate();
String content = restTemplate.postForObject(url,paramMap,String.class);

6. POST请求的默认响应

步骤5中我们POST请求了相应的地址,那么就会返回一个响应过来,默认响应如下:

access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&token_type=bearer

代码例子

// 获取access_token
int start = content.indexOf("=");
int end = content.indexOf("&");
String access_token = content.substring(start+1,end);

从上面的代码我们就正式拿到了令牌(Token)了,上面的access_token就是令牌

7. 获取用户信息

拿到令牌后就可以访问下面的地址来获取用户信息了

GET https://api.github.com/user?access_token=access_token

代码例子

// 获取用户信息
String getUrl = "https://api.github.com/user?access_token=" + access_token;
String user = restTemplate.getForObject(getUrl,String.class);

响应的用户信息

{
"login": "Howl",
"id": XXXXXX,
"node_id": "XXXXX",
"created_at": "2018-08-25T02:27:54Z",
"updated_at": "2020-04-30T05:30:25Z"
"还有挺多信息的" : "后面的省略了"
}

8. 完整代码

@RestController
@RequestMapping("/oauth")
public class OAuthController { @GetMapping("/redirect")
public String redirect(String code){ // 请求地址
String url = "https://github.com/login/oauth/access_token"; // POST参数必须用这个
MultiValueMap<String,String> paramMap = new LinkedMultiValueMap();
paramMap.add("client_id","XXXXXXXXXXXX");
paramMap.add("client_secret","XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
paramMap.add("code",code); // 发送请求
RestTemplate restTemplate = new RestTemplate();
String content = restTemplate.postForObject(url,paramMap,String.class); // 获取access_token
int start = content.indexOf("=");
int end = content.indexOf("&");
String access_token = content.substring(start+1,end); // 获取用户信息
String getUrl = "https://api.github.com/user?access_token=" + access_token;
String user = restTemplate.getForObject(getUrl,String.class); return user;
}
}

参考

https://developer.github.com/

http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

Github第三方登录的更多相关文章

  1. github 第三方登录

    第三方登录先了解 OAuth 2.0 OAuth 协议的认证和授权的过程如下: 用户打开我的博客后,我想要通过GitHub获取改用户的基本信息 在转跳到GitHub的授权页面后,用户同意我获取他的基本 ...

  2. [Next] Next.js+Nest.js实现GitHub第三方登录

    GitHub OAuth 第三方登录 第三方登录的关键知识点就是 OAuth2.0 . 第三方登录,实质就是 OAuth 授权 . OAuth 是一个开放标准,允许用户让第三方应用访问某一个网站的资源 ...

  3. 第三方登录之GitHub篇

    第一步,准备工作.获取Client ID和Client Secret 1.自行登陆GitHub官网,点击Setting,如下图: 2.继续,点击Developer settings,如下图: 3.继续 ...

  4. SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub

    GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...

  5. 第三方登录:新浪微博登录(OAuth2.0)

    在<Github第三方登录--通用化的第三方登陆实现>中我们实现了一个通用化的第三方登录框架,其中包括OAUth的基本流程以及最简单的用户注册.但是不同的第三方登录因为其细节不同还是有很多 ...

  6. 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结

    目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...

  7. github 授权登录教程与如何设计第三方授权登录的用户表

    需求:在网站上想评论一篇文章,而评论文章是要用户注册与登录的,那么怎么免去这麻烦的步骤呢?答案是通过第三方授权登录.本文讲解的就是 github 授权登录的教程. 效果体验地址:http://biao ...

  8. GitHub OAuth 第三方登录示例教程

    这组 OAuth 系列教程,第一篇介绍了基本概念,第二篇介绍了获取令牌的四种方式,今天演示一个实例,如何通过 OAuth 获取 API 数据. 很多网站登录时,允许使用第三方网站的身份,这称为&quo ...

  9. Github 第三方授权登录教程

    Github 第三方授权登录教程 ####大致流程图 ####1.首先注册一个github帐号,Applications>Developer applications>Register a ...

随机推荐

  1. Python学习-第四节:常用模块-logging,re,time

    1:logging模块 import logging logging.debug('This is debug message') logging.info('This is info message ...

  2. 《Three.js 入门指南》0 - 说明

    本笔记,摘自:<Three.js 入门指南>一书 地址链接为:https://www.ituring.com.cn/book/miniarticle/58552 本书的前言摘录: 本书结构 ...

  3. web页面调用支付宝支付

    web页面调用支付宝支付 此文章是前端单独模拟完成支付,若在线上环境则需要后台配合产生签名等参数 在蚂蚁金服开放平台申请沙箱环境 将沙箱环境中的密钥.应用网关.回调地址补全,生成密钥的方法在此 配置好 ...

  4. 1042 Shuffling Machine (20分)(水)

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techn ...

  5. JVM类加载过程详细分析

    双亲委派加载模型 为什么需要双亲委派加载模型 主要是为了安全,避免用户恶意加载破坏JVM正常运行的字节码文件,比如说加载一个自己写的java.util.HashMap.class.这样就有可能造成包冲 ...

  6. Python爬虫系列(五):分析HTML结构

    今晚,被烦死了.9点多才下班,就想回来看书学习,结果被唠叨唠叨个小时,我不断喊不要和我聊天了,还反复说.我只想安安静静看看书,学习学习,全世界都不要打扰我 接着上一个讨论,我们今晚要分析HTML结构了 ...

  7. GPS定位模块返回数据的处理

    本项目采用的是微科的VK2828U7G5LF,根据NMEA0183协议,打算采用反馈GPGLL语句来进行数据的处理. 1. 首先,本GPS模块默认的波特率是9600,因此,我们仅需要设置打开GPGLL ...

  8. Android电池信息获取

    Android 可以通过BroadcastReceiver来获取电池信息改变的广播(ACTION_BATTERY_CHANGED),从而获取到相关的电池信息. 电池信息,及其对应的相关常数(参考网址: ...

  9. 面试问了解Linux内存管理吗?10张图给你安排的明明白白!

    文章每周持续更新,各位的「三连」是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天来带大家研究一下Linux内存管理.对于精通 CURD 的业务同学 ...

  10. 给想学python但还没有接触过的你,python代码的书写规则,小白入门

    Python 文件结构 变量命名 注释 单行注释 多行注释 缩进 Python 文件结构 #!/usr/bin/env python3 # 指定python解释器 # -*- coding: utf- ...