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 ...
随机推荐
- 用python语言讲解数据结构与算法
写在前面的话:关于数据结构与算法讲解的书籍很多,但是用python语言去实现的不是很多,最近有幸看到一本这样的书籍,由Brad Miller and David Ranum编写的<Problem ...
- 我的第一个Linux C 程序
说明:上篇博客把gcc安装了,接着我们就尝试一下她的厉害吧. 我用的是vi的超级版本vim.这条指令,也就是用vim打开这个文件,如果文件不存在的话,那么创建这个文件. 关于Linux文件的创建,也可 ...
- SpringMVC自定义注入controller变量
springmvc config the controller parameter injection 问题描述 在SpringMVC中默认可以注入Model,ModelAndView,@Reques ...
- Redis批量删除KEY的方法
Redis 中有删除单个 Key 的指令 DEL,但好像没有批量删除 Key 的指令,不过我们可以借助 Linux 的 xargs 指令来完成这个动作. 代码如下: redis-cli keys “* ...
- ScrollView 里的 EditText 与输入法的用例
情景是这样的: 我希望页面可以滚动,因为长页面,内容多,必须滚动来满足不同手机的显示 点击 EditText 输入法弹出来,并将布局顶起来,并且EditText有足够的显示空间 进入页面时,输入法不能 ...
- [常见问题]在Linux下执行Redis命令不起作用.
redis 127.0.0.1:6379> 这个后面无论输入什么命令都没有返回 ok 或者其他的信息,一直保持截图的状态: 解决方法:在SecureCRT中设置Options-->Sess ...
- exe文件添加为服务
首先,去下载一个叫rktools.exe的工具(我提供个下载地址Windows 2003 Resource Kits),下载完后安装该资源包,里面有个instsrv.exe和srvany.exe的工具 ...
- linux 学习 常用命令
以下命令是本人的CentOS6.5系统 一.linux个目录的作用 #linux个目录的作用 /bin 所有用户都可使用的命令 /sbin 超级用户(root)可以使用的命令 /boot 系统目录建 ...
- 学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面
在上一篇文章中我们已经创建了实体类,在这一篇文章中,我将创建一个新的控制器类——BookController,使用BookController对Books表中的数据进行CURD操作的方法,并使用视图模 ...
- vuejs动态组件给子组件传递数据
vuejs动态组件给子组件传递数据 通过子组件定义时候的props可以支持父组件给子组件传递数据,这些定义的props在子组件的标签中使用绑定属性即可,但是如果使用的是<component> ...