如何支持github账号登录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何支持github账号登录相关的知识,希望对你有一定的参考价值。

1.在github上面建立一个应用对应自己需要接入的网站
首先我们自己需要一个github账号,登录自己的github账号,依次进入菜单Settings-Applications-Register new applications

新建一个应用,这里的应用就是我们需要支持github用户登录的网站,我们需要填写应用的名称,应用的url,应用的描述,以及github鉴权登录之后回调的地址。这里填写的用户的信息在用户通过github的登录页面进行登录你的网站的时候会展示给用户,如下图:

左边画红线的部分,是你的网站需要获取用户的数据,这个获取的数据范围在后面会详细进行介绍。右边画红线的部门就是新建应用时你填写的网站的信息。
注册一个新的引用之后会生成Client Id以及Client Secret,这就是我们接入github 提供的api的凭证。

2.自己网站的登录请求重定向到github提供的验证接口
API文档:https://developer.github.com/v3/oauth/
发送一个get请求到地址:https://github.com/login/oauth/authorize
参数:

参数名
类型
描述

client_id string 注册应用时的获取的client_id
redirect_uri string github鉴权成功之后,重定向到网站
scope string 获取用户的数据范围,具体的取值可以参照github给出的api文档:https://developer.github.com/v3/oauth/#scopes
state string 一个随机字符串,github鉴权成功之后会返回。
用户的登录请求被重定向到github的登录页面,登录成功之后,github会提示用户,需要暴露出的数据,用户确认通过之后,github会重新请求新建应用时候的回调地址,并返回参数code以及state。

router.get("/login", function(req, resp)
var dataStr = (new Date()).valueOf();
var path = "https://github.com/login/oauth/authorize";
path += '?client_id=' + gitConfig.clientId;
path += '&scope='+gitConfig.scope;
path += '&state='+ dataStr;
resp.redirect(path);
)

3.通过github返回的code信息请求token信息
这里不知道为啥github不支持返回token信息,而是返回一个参数code,通过这个code,再次去请求token。
我们先还是来看看github给出的接口文档:
接口地址:post https://github.com/login/oauth/access_token
参数:

参数名
类型
描述

client_id string Required. The client ID you received from GitHub when youregistered.
client_secret string Required. The client secret you received from GitHub when youregistered.
code string Required. The code you received as a response to Step 1.
redirect_uri string The URL in your app where users will be sent after authorization. See details below about redirect urls.
响应:
access_token=e72e16c7e42f292c6912e7710c838347ae178b4a&scope=user%2Cgist&token_type=bearer
文档中说明可以设置http请求头accept来返回不同的数据格式,application/json以及application/xml,但是试过之后貌似返回一堆乱码,不知道咋回事。这里就采用默认的键值对格式的字符串,然后自己解析。router.get("/loginAfter", function(req, resp)
var code = req.param('code');
var state = req.param('state');
var headers = req.headers;
var path = "/login/oauth/access_token";
headers.host = 'github.com';

path += '?client_id=' + gitConfig.clientId;
path += '&client_secret='+gitConfig.clientSecret;
path += '&code='+ code;

var opts =
hostname:'github.com',
port:'443',
path:path,
headers:headers,
method:'POST'
;
var req = https.request(opts, function(res)
res.setEncoding('utf8');
res.on('data', function(data)
var args = data.split('&');
var tokenInfo = args[0].split("=");
var token = tokenInfo[1];

)
);

4.根据获取的token去获取用户的信息GET https://api.github.com/user?access_token=

token拿到了,现在我们只需要通过获取到的token信息去请求用户的信息。
接口地址:GET https://api.github.com/user?access_token=
响应格式json:

var url = "https://api.github.com/user?access_token="+token;
https.get(url, function(res)
res.on('data', function(userInfo)

);
);
拿到用户的信息之后就好办了,是让用户完善个人信息,还是与自己网站已有的用户账号做绑定就看自己的想法了。
参考技术A 1.在github上面建立一个应用对应自己需要接入的网站
2.自己网站的登录请求重定向到github提供的验证接口
API文档:https://developer.github.com/v3/oauth/

发送一个get请求到地址:https://github.com/login/oauth/authorize
3.通过github返回的code信息请求token信息
接口地址:post https://github.com/login/oauth/access_token
4.根据获取的token去获取用户的信息

接口地址:GET https://api.github.com/user?access_token=
参考技术B http://blog.csdn.net/yangnianbing110/article/details/42925987
这篇文章比较接近你所提问的内容,参考借鉴一下吧

DemoQQ,github,微博第三方社交登录

本文主要讲解 集成 第三方社交账号登录

为什么会有这个需求?

主要是因为目前互联网的网站数量太多,如果在各个站点都注册一个账号 用户非常不容易记住每个账号的用户名和密码,并且非常难保证每个账号的密码足够安全

而目前流行的社交网站 基本上每个用户都有账号,如果通过这类社交网站登录 就能得到如下几点好处

  • 用户不用再注册其他账号

  • 用户只能维护社交账户足够安全就行了,使用此社交账号登录的就是安全的了

常见的第三方社交账号有哪些?

  • QQ

  • 微信

  • 新浪微博

  • 人人网

  • 百度

  • Github

如何加入第三方登录功能?

国内这些比较大的社交公司 都有专门的开放平台,有经验的开发者可以看开放平台是可以实现了,本人主要实现三个社交登录

  • 新浪微博登录

  • QQ登录

  • Github登录

申请新浪微博网页应用

进入 http://open.weibo.com/  申请网页应用,微博应用可以先申请等上线之后再提交审核


技术分享


技术分享


技术分享


技术分享


技术分享

申请QQ登录应用

进入 https://connect.qq.com/  ,登录之后 进入 应用管理,QQ应用需要先审核通过之后才可以使用(PS: 我被驳回了4次才通过,很多项和备案信息相关的)


技术分享

技术分享


技术分享


技术分享


技术分享

申请Github登录应用

进入https://github.com/  登录之后 进入 设置页面


技术分享


技术分享


技术分享


技术分享


实现 QQ,微博,Github登录功能

相关数据表

CREATE TABLE `user` (
  `uid` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘用户uid‘,
  `nickname` varchar(20) NOT NULL DEFAULT ‘‘ COMMENT ‘用户昵称‘,
  `unique_name` varchar(60) NOT NULL DEFAULT ‘‘ COMMENT ‘唯一标识‘,
  `avatar` varchar(500) NOT NULL DEFAULT ‘‘ COMMENT ‘用户头像‘,
  `mobile` varchar(11) NOT NULL DEFAULT ‘‘ COMMENT ‘用户手机号码‘,
  `updated_time` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘最后一次更新时间‘,
  `created_time` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘插入时间‘,
  PRIMARY KEY (`uid`),
  UNIQUE KEY `idx_name` (`unique_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=‘用户表‘;


CREATE TABLE `oauth_token` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `client_type` varchar(20) NOT NULL DEFAULT ‘‘ COMMENT ‘客户端来源类型‘,
  `token` varchar(100) NOT NULL DEFAULT ‘‘,
  `note` varchar(1000) NOT NULL DEFAULT ‘‘ COMMENT ‘备注‘,
  `valid_to` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘有效期截止日期‘,
  `updated_time` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘最后一次更新时间‘,
  `createdt_time` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘插入时间‘,
  PRIMARY KEY (`id`),
  KEY `client_type_token` (`client_type`,`token`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=‘oauth token 表‘;


CREATE TABLE `oauth_bind` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘用户uid‘,
  `client_type` varchar(20) NOT NULL DEFAULT ‘‘ COMMENT ‘客户端‘,
  `openid` varchar(80) NOT NULL DEFAULT ‘‘ COMMENT ‘第三方id‘,
  `extra` text NOT NULL COMMENT ‘额外字段‘,
  `created_time` timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ COMMENT ‘插入时间‘,
  PRIMARY KEY (`id`),
  KEY `idx_client_type_opend_id` (`client_type`,`openid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘第三方登录绑定关系‘;

实现架构

相关代码文件:https://github.com/apanly/dream/tree/master/common/service/oauth  

ClientService.php   统一第三方登录方法,应用程序的方法入口
GithubService.php  Github第三方登录相关方法
QqService.php      QQ第三方登录相关方法 
WeiboService.php   微博第三方登录相关方法


实例演示

地址: http://www.vincentguo.cn/oauth/login ,感兴趣大家可以自行前往试试


技术分享



技术分享


集成到商业产品需优化的地方

获取用户信息的相关逻辑,放入队列处理,因为获取信息还是比较慢的



原文地址:【Demo】QQ,github,微博第三方社交登录
标签:qq   微信   微博   oauth   第三方   登录   





























以上是关于如何支持github账号登录的主要内容,如果未能解决你的问题,请参考以下文章

如何设计 QQ微信微博Github 等等,第三方账号登陆 ?(附表设计)

Github多账号登陆

git基本操作:使用git将本地代码上传到GitHub

DemoQQ,github,微博第三方社交登录

如何使用laravel搭建后台登录系统

Git将 GitHub 工程设置为私有库 ( 登录账号 | 工程主页 | Settings | Danger Zone | Change visibility | Make private )