文档章节

使用 GitHub OAuth 第三方验证登录

DiamondFsd
 DiamondFsd
发布于 2017/05/06 17:32
字数 1043
阅读 3019
收藏 39

现在很多站点都支持第三方登录功能。
作为一个技术博客,目标受众项是一批程序员,第三方登录的就选中了github。
这篇文章注意是讲一讲如何给自己的博客添加github自动登录功能。

OAuth 2.0

说到第三方登录,不得不提的一个知识点就是 oauth 2.0。

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 ---- 百度百科

这个协议在认证和授权的时候涉及到:

  1. 服务提供方,例如 GitHub,GitHub上储存了用户的登录名,Email,昵称,头像等信息
  2. 用户
  3. 客户端,例如我的博客就是一个客户端,需要服务方向我提供用户的一些基本信息

OAuth 协议的认证和授权的过程如下:

  1. 用户打开我的博客后,我想要通过GitHub获取改用户的基本信息
  2. 在转跳到GitHub的授权页面后,用户同意我获取他的基本信息
  3. 博客获得GitHub提供的授权码,使用该授权码向GitHub申请一个令牌
  4. GitHub对博客提供的授权码进行验证,验证无误后,发放一个令牌给博客端
  5. 博客端使用令牌,向GitHub获取用户信息
  6. GitHub 确认令牌无误,返回给我基本的用户信息

如何使用GitHub提供的 OAuth 服务

  1. 打开 Setting > Developer setting > OAuth applications
  2. 点击 Register a new application
  3. 填入基本的app信息
  4. 创建成功,会有如下页面

alt

这里的各项配置具体的作用,我们还是看一看GitHub提供的文档 OAuth GitHub Developer Guide

具体流程

  1. 转跳到 GitHub 用户授权页面, client_id 必须传
    其他参数如果有需要就传,例如我这里需要获取用户的邮箱信息,就加了一个 scope=user:email
    最终拼成的URL如下:
    https://github.com/login/oauth/authorize?client_id=myclient_id&scope=user:email

  2. 当用户同意授权后,链接地址就会转跳到 我们配置页面内的 Authorization callback URL 所填写的URL地址,并且会带上一个 code参数,这个参数在后面获取用户token是必须的一个参数。
    获取到这个code参数后,我会将这个code传到服务器的后台,然后后台调用 https://github.com/login/oauth/access_token 这个api,传入 client_id client_secret code 这三个参数,可以获取到一个 access_token。

  3. 获取到 access_token 后, 再调用 https://api.github.com/user?access_token=access_token 这个API,就可以获取到基本的用户信息了。 用户的基本信息内容如下所示, 根据第一步传入的不同的 scope,获取到的用户信息也是不同的。博客后台使用 login 字段作为用户的唯一标示,因为email 可能为空,之前用email发生了一些bug。

{
    "login": "Diamondtest",
    "id": 28478049,
    "avatar_url": "https://avatars0.githubusercontent.com/u/28478049?v=3",
    "gravatar_id": "",
    "url": "https://api.github.com/users/Diamondtest",
    "html_url": "https://github.com/Diamondtest",
    "followers_url": "https://api.github.com/users/Diamondtest/followers",
    "following_url": "https://api.github.com/users/Diamondtest/following{/other_user}",
    "gists_url": "https://api.github.com/users/Diamondtest/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/Diamondtest/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/Diamondtest/subscriptions",
    "organizations_url": "https://api.github.com/users/Diamondtest/orgs",
    "repos_url": "https://api.github.com/users/Diamondtest/repos",
    "events_url": "https://api.github.com/users/Diamondtest/events{/privacy}",
    "received_events_url": "https://api.github.com/users/Diamondtest/received_events",
    "type": "User",
    "site_admin": false,
    "name": null,
    "company": null,
    "blog": "",
    "location": null,
    "email": null,
    "hireable": null,
    "bio": null,
    "public_repos": 0,
    "public_gists": 0,
    "followers": 0,
    "following": 0,
    "created_at": "2017-05-06T08:08:09Z",
    "updated_at": "2017-05-06T08:16:22Z"
}

这样,从获取授权,到获得用户信息的流程就走完了。 再根据自己的需求进行用户信息储存,自有登录的接入,用户资料的管理。就完成了一套第三方登录的方案。

目前市面上主流的协议就是 OAuth2.0。 例如 QQ,微信,微博等等。 所以只要搞明白大概流程,那么接入其他供应商的第三方登录也是小菜一碟了。

希望这篇文章对大家有所帮助,有什么意见和想法,也可以在本文底部留言。

© 著作权归作者所有

共有 人打赏支持
DiamondFsd
粉丝 88
博文 15
码字总数 16372
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

万物皆虚万事皆允
万物皆虚万事皆允
国内的一些Oauth2.0授权的官方文档真的不忍直视,感觉写接口的和写文档的是陌生人
__小松同学
__小松同学
SPring boot的oauth2.0 Demo例子就是使用github和facebook的,非常详细的全流程
OAuth的机制原理讲解及开发流程

本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。...

只想一个人静一静
2014/04/26
0
0
YMP v2.0 模块项目集中发布!第一波!

经过很长时间的准备,将项目中用到的一些比较实用的模块进行提取重构,释放出来与大家分享! 如果她对你有帮助,也希望不吝收藏、点赞!当然,请我们喝杯咖啡也是好滴嘛 :p! 更希望大家多多...

有理想的鱼
2017/05/08
1K
3
android开发之第三方集成之OAUTH教程篇

微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用。足不出户,也变成了现实。作为程序员我们更加关注的是为我所用。幸好的是微博运行商为我们提供了丰富的接口,我们可以善...

长平狐
2012/08/21
1K
0
OAuth认证协议原理分析及使用方法

twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了, 这种网站就是这个效果。其实这都是拜 OAuth所赐。 OAuth是什么...

晨曦之光
2012/03/09
285
0
android开发之第三方集成之OAUTH教程篇

微博作为新兴的一项网络工具,在某种意义上讲实现了把世界变小的作用。足不出户,也变成了现实。作为程序员我们更加关注的是为我所用。幸好的是微博运行商为我们提供了丰富的接口,我们可以善...

长平狐
2012/08/09
649
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
11
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部