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的第三方验证的更多相关文章

  1. GitHub 二次验证收不到短信咋办?

    身在天朝,用了国外的代码托管服务,会有些烦恼的. 网速慢就不说了,如果启用了二次验证,短信收不到那就悲催了. 之前的都能收到短信的,突然间尝试了很多天都不行,联系github的客服,几次的答复如下: ...

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

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

  3. git操作是出现Username for 'https://github.com':的验证问题

    Username for 'https://github.com': 输入的是github上的邮箱账号, 而不是github中设置的username, 这是个巨坑!!!Password for 'ht ...

  4. mac电脑Git提交代码到Github提示git-credential-osxkeychain 验证解决方案

    ## 啊哈哈 这个简单,直接给出当前mac电脑登录账号密码即可,^_*,拿走不谢!!

  5. github 第三方登录

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

  6. CodeSnippet.info整体技术构架

    CodeSnippet.info整体架构 服务器端 Asp.NET MVC5 考察过MVC6,但是现在MVC6还不成熟,技术上不稳定,很多资料也比较少. 所以网站暂时使用MVC5.当然网站的大部分业务 ...

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

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

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

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

  9. Github第三方登录

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

随机推荐

  1. Unity3D使用经验总结 优点篇

    09年还在和其它小伙伴开发引擎的时候,Unity3D就初露头角. 当时就对这种基于组件式的设计结构很不理解. 觉得拆分过于细致,同时影响效率. 而时至今日,UNITY3D已经成为了众多团队的首选3D引 ...

  2. Redmined的历史记录显示 "Updated by {{author}} {{age}} ago"

    最近Redmine出了点问题,简单查了一下,是ruby的本地冲突包i18n导致的, 先到redmine中跑命令: gem list --local,  查出本地ruby安装的所有的包 这里可以看到i1 ...

  3. ssh/openssh

    http://www.cnblogs.com/wwufengg/articles/ssh-openssh-detail.html http://www.cnblogs.com/jjkv3/archiv ...

  4. 这里有个坑---[NotMapped]不要忘了加

    这里有个坑,我们定义实体的时候如果使用了在数据库没有的字段记得加[NotMapped]---------每一个遇到的坑总结后都是一比财富. 在项目中我们一般会使用EF等ORM框架来为我们服务,在ORM ...

  5. Java基础之打印万年历

          今天刚开的博客,第一篇博文,一篇关于Java基础的内容,水平有限,多多见谅,希望和大家在学习编程的路上共同进步. 问题:输入年,月,打印对应年月的日历.   示例: ----------- ...

  6. 我心中的核心组件(可插拔的AOP)~消息组件~完善篇

    回到目录 为什么要有本篇文章 本篇文章主要实现了RTX消息生产者,并且完成了整体的设计方式,之前在设计时消息生产者全局使用单一的生产方式,即一个项目里使用了Email就不能使用SMS,这种设计方法和实 ...

  7. Atitit 发帖机系列(8)  词法分析器v5 版本新特性说明)

    Atitit 发帖机系列(8)  词法分析器v5 版本新特性说明) v5  增加对sql单引号的内部支持.可以作为string 结构调整,使用递归法重构循环发..放弃循环发. V4 java dsl词 ...

  8. Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证

    Atitit ACID解决方案2PC(两阶段提交)  跨越多个数据库实例的ACID保证 1.1. ACID解决方案1 1.2. 数据库厂商在很久以前就认识到数据库分区的必要性,并引入了一种称为2PC( ...

  9. fir.im Weekly - 如何做一个出色的程序员

    做一个出色的程序员,困难而高尚.本期 fir.im Weekly 精选了一些实用的 iOS,Android 开发工具和源码分享,还有一些关于程序员的成长 Tips 和有意思有质量的线下活动~ How ...

  10. D3.js 学习( 一)

    <html> <head> <meta charset="utf-8"> <title>第三课:为柱形图添加坐标轴</titl ...