博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我也想聊聊 OAuth 2.0 —— Access Token
阅读量:6508 次
发布时间:2019-06-24

本文共 4365 字,大约阅读时间需要 14 分钟。

这是一篇待在草稿箱半年之久的文章

连我自己都不知道我的草稿箱有多少未发布的文章了。这应该是我在上一家公司未解散之前写的,记得当时是要做一个开发者中心,很不幸。

今天,打开草稿箱有种莫名的伤感,看到这个一系列关于 OAuth 的草稿(其实也就两篇而已),我决定重新发表出来。因为,我看到之前简单写的一个的小工具,放到Github上以后,好多大的企业在免费使用,如:某某新闻网、某某云服务和一家硬件公司等,其实我非常高兴的,因为我一直在免费使用好多开源社区的福利。有机会做一点微薄的贡献,这个世界会更好。

上一篇:

你在北方的寒夜里瑟瑟如狗,我在南方的艳阳里看你发抖

我的朋友圈反正今天早上是被「雪」爆了,而我依然穿着短袖。看到老三拍了两张带有老家标志建筑物的雪景照,发了条朋友圈说我有点想家了,老二回复说:回来呗。突然,鼻子一酸...回复他:老子在挤地铁!!!回屁家。然后,我喝了口凉水后心情大好!

回到正题,你肯定已经了解到什么是 OAuth 2.0 了,你说它不就是一个协议么,但是那些第三方接口都有什么ClientIdClientSecretAccess TokenRefresh Token等等之类的,看着都头晕,这些到底是什么阿阿阿?。是这样的,我也如你一样苦恼,这些到底都是什么鬼、干什么的?这篇文章就讲清道明这些东西到底是什么鬼!!!

一个开发者中心的授权流程是怎样的

上文好像说到我们要开发一个「开发者中心」,所以,我想先讲一下这个所谓的「开发者中心」是怎样把数据开放给开发者的。

正如你所知道的数据是无价的,我们并不想任何人都能通过我们的开放平台来获取数据。举个栗子:你家有好多书,其实你并不看,但有好多朋友想看,你又不想任何人都能去你家拿走你心爱的《C#入门经典》,首先他要向你说明他想借你的书看看,你同意后说:你请我吃饭吧,然后我给你我家钥匙你自己去取吧,我忙。这个过程就叫做:授权!请你吃饭可以理解为ClientIdClientSecret,你家的钥匙就是所谓的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    {        ///         ///     验证客户端        ///         ///         /// 
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); } /// /// 客户端授权[生成access token] /// /// ///
public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context) { var oAuthIdentity = new ClaimsIdentity(context.Options.AuthenticationType); oAuthIdentity.AddClaim(new Claim(ClaimTypes.Name, context.OwinContext.Get
("as:client_id"))); var ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties {AllowRefresh = true}); context.Validated(ticket); return base.GrantClientCredentials(context); } }

Ⅴ. 没有第五步了。是不是很简单。

测试

我听说用测试API接口比较爽,然后我就用了它。

Ⅰ. 当没有获取Token时,请求/api/values接口。

无授权

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

获取Token

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

有Headers

那行,总结一下

我们利用Microsoft.Owin.Security.OAuth和 Web API 实现了遵循 OAuth 2.0 协议的授权流程,这为我们开发「开发者中心」打下了坚实基础,让我们展望美好的未来吧。ps:说的真官方,能不能说人话。

最后一句:源码在Github上

转载地址:http://yiwfo.baihongyu.com/

你可能感兴趣的文章
ffmpeg获取视频封面图片
查看>>
干净的架构The Clean Architecture_软件架构系列
查看>>
从房地产住宅销售面积增速看房地产行业
查看>>
poj 1661 Help Jimmy (动态规划)
查看>>
前端之css样式02
查看>>
Vue Devtools--vue调式工具
查看>>
Web 研发模式演变 | 搞懂历史
查看>>
阶乘的精确值
查看>>
[LeetCode系列]子集枚举问题[无重复元素]
查看>>
winfrom 菜单栏遮挡工作区
查看>>
iOS设计模式
查看>>
docker学习实践之路[第四站]利用pm2镜像部署node应用
查看>>
基于android混合开发的JsBridge技术学习
查看>>
leetcode150 Evaluate Reverse Polish Notation
查看>>
Hibernate4.1.4配置二级缓存EHCache步骤
查看>>
用PHP抓取淘宝商品的用户晒单评论+图片实例
查看>>
Eclipse 创建Maven工程
查看>>
男神的补习
查看>>
Codeforces 768C:Jon Snow and his Favourite Number
查看>>
程序猿眼中的高并发
查看>>