Github的第三方验证
Github的第三方验证
随着近年来网络安全越来越受到重视,对于用户认证和用户信息保存模块的开发也提升到了一个新的高度。
一般小型网站开发的时候,由于技术水平和时间成本有限,很有可能会开发出一些或大或小的问题。幸好有许多第三方的OAuth服务可能帮我们简化这个问题。
由于http://codesnippet.info/ 是一个技术网站,所以一般使用本网站的用户都会有Github账号。
同时,通过获取Github账号的个人基本信息,对于用户之间的交流(Github的电子邮件),用户水平的了解(追随者数量)也有很大帮助。
为你的网站申请APP第三方验证
首先你必须要有一个Github的账号。如何申请Github的账号,这里就不需要再啰嗦了。
注意这里的ClientID和SecretCode是整个OAuth的凭证,不要将这个信息泄露出去。

- Application Name:应用名称(重要)
- HomePageURL:网站的URL
- ApplicationDescription:网站描述
- Authorization callback URL:回调地址 (重要)

关于回调地址,我原来有个误区,认为是Github服务器将数据Post到我的网站,就像微信公众平台那样,其实这里的回调地址是客户的浏览器发出的重定向地址。同时,这个地址是可以使用 localhost 的,这样的话对于我们调试程序会带来巨大的好处。
第三方认证的开发
认证按钮
string clientid = "https://github.com/login/oauth/authorize?client_id=" + ConfigurationManager.AppSettings["ClientID"];
整个认证的起始点是浏览器对于这个链接的访问,这里需要你的ClientID信息,这个信息是对所有人公开的。
网站看上去是这个样子的
https://github.com/login/oauth/authorize?client_id=01a8bf26baecfa8db577
认证后的回调
如果用户通过了验证,则浏览器将被重新定向到你定义的回调网址,同时会带上一个code参数
你的程序需要将这个code参数,以及你的ClientID和SecretID来获得AccessToken。
这里有几个地方必须注意:
UserAgent必须有,而且是AppName!
这个方法不能用Winform程序调试,因为这样可能造成一些跨域访问的问题。虽然使用Winform可以获得Code,但是AccessToken是无论如何也无法获得的!
获得了AccessToken之后,可以获得用户的信息了,不过这个AccessToken不是写在获得用户信息的URL里面的,而是写在HTTPHEAD里面的。
/// <summary>
/// 获得login
/// </summary>
/// <param name="Code"></param>
/// <returns></returns>
public static GithubAccount GetUserInfo(string Code)
{
try
{
var resonseJson = "";
var webRequest = WebRequest.Create(githubTokenUrl) as HttpWebRequest;
webRequest.Method = "POST";
webRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
//Github API V3必须加上下面这句话!
webRequest.UserAgent = AppName;
var postData = string.Format("code={0}&client_id={1}&client_secret={2}", Code, ClientID, ClientSecret);
//在HTTP POST请求中传递参数
using (var sw = new StreamWriter(webRequest.GetRequestStream()))
{
sw.Write(postData);
sw.Close();
}
//发送请求,并获取服务器响应
using (var response = webRequest.GetResponse())
{
using (var sr = new StreamReader(response.GetResponseStream()))
{
resonseJson = sr.ReadToEnd();
}
}
var resultparms = resonseJson.Split("&".ToCharArray());
var accessToken = string.Empty;
foreach (var parm in resultparms)
{
if (parm.StartsWith("access_token="))
{
accessToken = parm.Split("=".ToCharArray())[1];
}
}
webRequest = WebRequest.Create("https://api.github.com/user") as HttpWebRequest;
webRequest.Method = "GET";
webRequest.Headers.Add("Authorization", "token " + accessToken);
//Github API V3必须加上下面这句话!
webRequest.UserAgent = AppName;
using (var response = webRequest.GetResponse())
{
using (var sr = new StreamReader(response.GetResponseStream()))
{
dynamic obj = JsonConvert.DeserializeObject(sr.ReadToEnd());
GithubAccount gitlogin = new GithubAccount()
{
Login = obj.login,
Avatar_url = obj.avatar_url,
Email = obj.email,
Name = obj.name,
Html_url = obj.html_url,
Company = obj.company,
Blog = obj.blog,
Location = obj.location,
Followers = obj.followers,
Following = obj.following,
LastAccess = DateTime.Now
};
//省略
}
}
catch (Exception ex)
{
InfraStructure.Log.ExceptionLog.Log("SYSTEM", "GitHubOAuth", "GET USER INFO", ex.ToString());
return null;
}
}
个人基本信息
从github账号中可以获得的个人基本信息如下:
{
"login": "magicdict",
"id": 897796,
"avatar_url": "https://avatars.githubusercontent.com/u/897796?v=3",
"gravatar_id": "",
"url": "https://api.github.com/users/magicdict",
"html_url": "https://github.com/magicdict",
"followers_url": "https://api.github.com/users/magicdict/followers",
"following_url": "https://api.github.com/users/magicdict/following{/other_user}",
"gists_url": "https://api.github.com/users/magicdict/gists{/gist_id}",
"starred_url": "https://api.github.com/users/magicdict/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/magicdict/subscriptions",
"organizations_url": "https://api.github.com/users/magicdict/orgs",
"repos_url": "https://api.github.com/users/magicdict/repos",
"events_url": "https://api.github.com/users/magicdict/events{/privacy}",
"received_events_url": "https://api.github.com/users/magicdict/received_events",
"type": "User",
"site_admin": false,
"name": "MagicHu",
"company": "Shanghai Chuwa software co.ltd",
"blog": "http://www.mywechatapp.com",
"location": "Shanghai,China",
"email": "mynightelfplayer@hotmail.com",
"hireable": true,
"bio": null,
"public_repos": 7,
"public_gists": 0,
"followers": 50,
"following": 2,
"created_at": "2011-07-06T09:26:40Z",
"updated_at": "2016-02-06T09:09:34Z"
}
参考资料
An introduction to the ASP.NET 5 Generic OAuth Provider
Github的第三方验证的更多相关文章
- GitHub 二次验证收不到短信咋办?
身在天朝,用了国外的代码托管服务,会有些烦恼的. 网速慢就不说了,如果启用了二次验证,短信收不到那就悲催了. 之前的都能收到短信的,突然间尝试了很多天都不行,联系github的客服,几次的答复如下: ...
- GitHub OAuth 第三方登录示例教程
这组 OAuth 系列教程,第一篇介绍了基本概念,第二篇介绍了获取令牌的四种方式,今天演示一个实例,如何通过 OAuth 获取 API 数据. 很多网站登录时,允许使用第三方网站的身份,这称为&quo ...
- git操作是出现Username for 'https://github.com':的验证问题
Username for 'https://github.com': 输入的是github上的邮箱账号, 而不是github中设置的username, 这是个巨坑!!!Password for 'ht ...
- mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案
## 啊哈哈 这个简单,直接给出当前mac电脑登录账号密码即可,^_*,拿走不谢!!
- github 第三方登录
第三方登录先了解 OAuth 2.0 OAuth 协议的认证和授权的过程如下: 用户打开我的博客后,我想要通过GitHub获取改用户的基本信息 在转跳到GitHub的授权页面后,用户同意我获取他的基本 ...
- CodeSnippet.info整体技术构架
CodeSnippet.info整体架构 服务器端 Asp.NET MVC5 考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少. 所以网站暂时使用MVC5.当然网站的大部分业务 ...
- 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结
目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...
- [Next] Next.js+Nest.js实现GitHub第三方登录
GitHub OAuth 第三方登录 第三方登录的关键知识点就是 OAuth2.0 . 第三方登录,实质就是 OAuth 授权 . OAuth 是一个开放标准,允许用户让第三方应用访问某一个网站的资源 ...
- Github第三方登录
笔者第一次写网站只写了接收参数以及登录页面就兴奋了一整天,还特意地加上了第三方登录,想起当时的情景还历历在目.之前是照着被人的博客一步步完成第三方登录的功能,现在就要自己来理解完成了 1. OAuth ...
随机推荐
- [异常解决] vmware tools 虚拟机 --> 更新/导入wmwera tools菜单变灰,无法导入问题解决
在虚拟中的装Ubuntu只要下载一个Ubuntu镜像,按照新建的指示一步一步安装 ,但是安装好之后想从原来系统中复制点东西到虚拟机中的Ubuntu中却有点麻烦.幸好Vmware自带了一个VMware ...
- 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...
- Ember.js实现单页面应用程序
1.1.1 摘要 单页应用程序 (SPA) 是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序. SPA使用AJAX和HTML5创建流畅且响应迅速的Web应用程序,不会经常 ...
- 汇编 int10h(转)
原文:http://www.cnblogs.com/magic-cube/archive/2011/10/19/2217676.html INT 10H 是由 BIOS 对屏幕及显示器所提供的服务程序 ...
- UStore-添加自定义工作流(JDF)到产品
这里使用的是8.2版本.所有的帮助文档可以在可以看到: http://www.xmpie.com/uStore%20Help/uStore_Help_Page.htm 1.登录 首先,登录到ustor ...
- ios CGRect
/* rect(x,y,width,height); width, height正负代表了从原点的绘制方向,矩形的长宽都是取得绝对值 */ // Do a ...
- js里cookie操作
原生js操作cookie 创建和存储 cookie 在这个例子中我们要创建一个存储访问者名字的 cookie.当访问者首次访问网站时,他们会被要求填写姓名.名字会存储于 cookie 中.当访问者再次 ...
- 锋利的JQuery —— 事件和动画
大图猛戳
- iOS-ARC项目使用非ARC文件 MRC项目使用ARC文件
SDK4.0引入了ARC,到现在已经好几年了,开始发现有很多项目会混合使用这两个方案.比如: 1.自己的旧项目没有使用ARC,但是引入的第三方库却是使用了ARC的. 2.自己的新项目使用了ARC,但是 ...
- Android开发之时间日期1
对于手机的时间日期设置估计大家一定都不陌生吧,今天做了一个关于时间日期设置的小例子,其中遇到一个问题,求指导,如何使设置的时间日期和手机系统同步?还望高手指点一二. 先不说这个了,分享一下我的小例子 ...