我也想聊聊 OAuth 2.0 —— Access Token
这是一篇待在草稿箱半年之久的文章
连我自己都不知道我的草稿箱有多少未发布的文章了。这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸。
今天,打开草稿箱有种莫名的伤感,看到这个一系列关于 OAuth 的草稿(其实也就两篇而已),我决定重新发表出来。因为,我看到之前简单写的一个一行代码,发送邮件的小工具,放到Github上以后,好多大的企业在免费使用,如:某某新闻网、某某云服务和一家硬件公司等,其实我非常高兴的,因为我一直在免费使用好多开源社区的福利。有机会做一点微薄的贡献,这个世界会更好。
你在北方的寒夜里瑟瑟如狗,我在南方的艳阳里看你发抖
我的朋友圈反正今天早上是被「雪」爆了,而我依然穿着短袖。看到老三拍了两张带有老家标志建筑物的雪景照,发了条朋友圈说我有点想家了,老二回复说:回来呗。突然,鼻子一酸...回复他:老子在挤地铁!!!回屁家。然后,我喝了口凉水后心情大好!
回到正题,你肯定已经了解到什么是 OAuth 2.0 了,你说它不就是一个协议么,但是那些第三方接口都有什么ClientId、ClientSecret、Access Token、Refresh Token等等之类的,看着都头晕,这些到底是什么阿阿阿?。是这样的,我也如你一样苦恼,这些到底都是什么鬼、干什么的?这篇文章就讲清道明这些东西到底是什么鬼!!!
一个开发者中心的授权流程是怎样的
上文好像说到我们要开发一个「开发者中心」,所以,我想先讲一下这个所谓的「开发者中心」是怎样把数据开放给开发者的。
正如你所知道的数据是无价的,我们并不想任何人都能通过我们的开放平台来获取数据。举个栗子:你家有好多书,其实你并不看,但有好多朋友想看,你又不想任何人都能去你家拿走你心爱的《C#入门经典》,首先他要向你说明他想借你的书看看,你同意后说:你请我吃饭吧,然后我给你我家钥匙你自己去取吧,我忙。这个过程就叫做:授权!请你吃饭可以理解为ClientId、ClientSecret,你家的钥匙就是所谓的Token。
够了够了,你说的这些我都懂,那怎么用代码要体现呢?
利用 Web API 来实现 OAuth 授权
为什么是 Web API ?
因为 ASP.NET Web API 是针对接口而生的阿。况且它还是REST风格的哦,更轻量级一些,其实这些都不重要,重要的它够简单,十分钟即可上手。
怎么使用 OAuth 的方式实现授权?
Microsoft.Owin.Security.OAuth,就是它!你要知道这可是.Net的可爱之处,她把你需要的就放在了那里,你用不用她就在那。现在就使用它来实现 OAuth 2.0 中所说的四种授权模式之一的客户端模式(client credentials)。
Ⅰ. 打开VS2013,新建一个 Web API 项目。源码
Ⅱ. 在Project右键,选择“管理NuGet程序包”,搜索“Owin”。安装下面的包:
- Microsoft.Owin.Security.OAuth
- Microsoft.Owin.Security
- Microsoft.Owin
- Microsoft.Owin.Host.SystemWeb(我被它坑了好久)
- OWIN
- Microsoft ASP.Net Web API 2.2 OWIN
- Microsoft ASP.Net Identity OWIN
Ⅲ. 修改 Startup.cs 文件如下,如没有,则新建。
using ...
[assembly: OwinStartup(typeof (Startup))]
namespace Mafly.OAuth2._0.Demo
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
// 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
var config = new HttpConfiguration();
WebApiConfig.Register(config);
//开启OAuth服务
ConfigureOAuth(app);
app.UseWebApi(config);
}
public void ConfigureOAuth(IAppBuilder app)
{
// Token 生成配置
var oAuthOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true, //允许客户端使用Http协议请求
AuthenticationMode = AuthenticationMode.Active,
TokenEndpointPath = new PathString("/token"), //请求地址
AccessTokenExpireTimeSpan = TimeSpan.FromHours(2), //token过期时间
//提供认证策略
Provider = new OpenAuthorizationServerProvider()
//RefreshTokenProvider = new RefreshAuthenticationTokenProvider()
};
app.UseOAuthBearerTokens(oAuthOptions);
}
}
}
Ⅳ. 新建OpenAuthorizationServerProvider
public class OpenAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
/// <summary>
/// 验证客户端
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret;
context.TryGetFormCredentials(out clientId, out clientSecret);
//context.TryGetBasicCredentials(out clientId, out clientSecret); //Basic认证
//TODO:读库,验证
if (clientId != "malfy" && clientSecret != "111111")
{
context.SetError("invalid_client", "client is not valid");
return;
}
context.OwinContext.Set("as:client_id", clientId);
context.Validated(clientId);
}
/// <summary>
/// 客户端授权[生成access token]
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context)
{
var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.OwinContext.Get<string>("as:client_id")));
var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties {AllowRefresh = true});
context.Validated(ticket);
return base.GrantClientCredentials(context);
}
}
Ⅴ. 没有第五步了。是不是很简单。源码
测试
我听说用postman测试API接口比较爽,然后我就用了它。
Ⅰ. 当没有获取Token时,请求/api/values接口。

Ⅱ. 那好,我们来获取Token。

Ⅲ. 得到了access_token,我们添加Headers,Header:Authorization Value:bearer [token],token就是access_token。

那行,总结一下
我们利用Microsoft.Owin.Security.OAuth和 Web API 实现了遵循 OAuth 2.0 协议的授权流程,这为我们开发「开发者中心」打下了坚实基础,让我们展望美好的未来吧。ps:说的真官方,能不能说人话。
最后一句:源码在Github上 https://github.com/mafly/OAuth2.0
我也想聊聊 OAuth 2.0 —— Access Token的更多相关文章
- 我也想聊聊 OAuth 2.0 —— 基本概念
这是一篇待在草稿箱半年之久的文章 连我自己都不知道我的草稿箱有多少未发布的文章了.这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸. 今天,打开草稿箱有种莫名的伤感,看到这个 ...
- 聊聊 OAuth 2.0 的 token expire_in 使用
问题背景 有同学私信问了这样的问题,访问 pig4cloud 的演示环境 查看登录请求 network 返回报文如下: { "access_token":"16d3579 ...
- 聊聊 OAuth 2.0 的 Token 续期处理
Token 校验逻辑 // CheckTokenEndpoint.checkToken @RequestMapping(value = "/oauth/check_token") ...
- OAuth 2.0: Bearer Token Usage
Bearer Token (RFC 6750) 用于HTTP请求授权访问OAuth 2.0资源,任何Bearer持有者都可以无差别地用它来访问相关的资源,而无需证明持有加密key.一个Bearer代表 ...
- Bearer Token & OAuth 2.0
Bearer Token & OAuth 2.0 access token & refresh token http://localhost:8080/#/login HTTP Aut ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- NET WebApi OWIN 实现 OAuth 2.0
NET WebApi OWIN 实现 OAuth 2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和 ...
- OAuth 2.0 / RCF6749 协议解读
OAuth是第三方应用授权的开放标准,目前版本是2.0版,以下将要介绍的内容和概念主要来源于该版本.恐篇幅太长,OAuth 的诞生背景就不在这里赘述了,可参考 RFC 6749 . 四种角色定义: R ...
- [转]ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
随机推荐
- 【转】对 Xcode 菜单选项的详细探索(干货)
http://www.cocoachina.com/ios/20151204/14480.html 本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xco ...
- eclipse、myeclipse,svn插件subclipse 忘记密码的解决方法(win7、win8、xp)
如果是Windows7.Windows8系统只要删除当前用户目录下的AppData\Roaming\Subversion\auth\svn.simple 比如我的用户名taoweiji,就删除C:\U ...
- Maven Nexus Setup tutorial
Technorati 标签: maven,nexus 1. download the Nexus from website for free version: 2. Run the Command p ...
- SVO实时全局光照优化(里程碑MK2):Sparse Voxel Octree based Global Illumination (SVO GI)
自主实现的实时渲染引擎,对标对象ue4/ce5,超越u3d/klayge.MK2版本侧重于质量与速度的均衡,以下上传示范均为实测截图,均为全分辨率(网页上显示缩小了)1080p/60fps.
- db2 中文表名和字段
建库语句 create db test on D: using codeset GBK territory CN 或者 territory cn codeset 和 territory 都是需要指定 ...
- 【转】开放api接口签名验证
不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...
- 利用cmdline和gradle快速编译出apk
http://blog.csdn.net/qq_16628781/article/details/49365139 gradlew.bat clean build --info > bugtag ...
- 通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 解析办法
EasyRadius提示:通信错误:(-1)[描述:无法解析路由器DDNS地址,请检查DDNS状态.] 出现以上问题,和easyradius没有直接的联系,主要产生原因有两种可能: 可能1:easyr ...
- Windows下修改Oracle默认的端口1521
数据库最好不对公网开放,如果要开放,最好把默认端口改掉,防止一些针对 1521端口的入侵 1.找到 product\11.2.0\dbhome_1\NETWORK\ADMIN 下面的 listene ...
- Jenkins xcodebuild There are no schemes in workspace
Manage Schemes... 勾选 Shared 参考:http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not- ...