前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >[腾讯社区开放平台]介绍开放授权协议-OAuth

[腾讯社区开放平台]介绍开放授权协议-OAuth

作者头像
张善友
发布于 2018-01-19 08:44:28
发布于 2018-01-19 08:44:28
1.8K0
举报
文章被收录于专栏:张善友的专栏张善友的专栏

OAuth (开放授权) 是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。OAuth是OpenID的一个补充,但是完全不同的服务。

OAuth,一个让人又爱又恨的验证协议,它让许多主流的社交网站(SNS)与网络服务打开了封闭已久的验证大门,它也是在网络上公开个人或私人信息 (private data) 前最主要的验证管道之一,重要的是,在这个协议下,所有公开给外界的私有数据会受到两个阶段的保护,OAuth 保障用户可以在应用程序要求数据前由用户做明确授权,只有授权过的资源才会开放给应用程序读取,而且 OAuth 公开的特性,可以让应用程序在极少量程序代码的修改下,移植到不同的服务继续使用,而 OAuth 协议也让服务端精确的控制要开放的服务,并且提供使用者授权的管道以让使用者能自由控制授权与否,而且客户端应用程序只要利用 HTTP 协议即可使用OAuth 服务。那为什么我会说又爱又恨呢?因为它真的不容易使用,会让想使用它的开发人员头发被抓掉好几百根,最近2周在折腾腾讯开放社区的QQ登陆,QQ登陆也是使用OAuth ,具体参看 【QQ登录】OAuth登录文档,开始的时候使用的是DotnetOpenauth,一直进行不下去,问题的原因就是腾讯开放社区的QQ登陆的OAuth不是很标准,无奈之余只好根据QQ登陆文档重头构建一个验证库,我把它托管在codeplex上,地址是http://qqconnect.codeplex.com/,所有的功能还未完成,欢迎有同样需求的各位同学加入。

OAuth 是 Open Authorization 的缩写,由 2006 年起草的新验证标准,当时产业界还有一些不同的协议,像是 Open ID,Shibboleth,WS-Federation 等协定,这些都被称为 Central Authentication Service (中央验证服务),只是这些协议使用上都不怎么容易,有些有明确的软件平台限制,有些则是要装某些套件等,比如微软的WIF,OAuth 则是比较后期出现的服务,但它用起来简单,又兼容于 HTTP 的标准,任何可以产生 HTTP 通讯方式的平台与函式库都可以使用,它也很常搭配 Open ID 使用,所以在一些大型网络服务平台 (ex: Google, Yahoo) 会看到 Open ID + OAuth 的格式,但 OAuth 本身也具备验证能力,不过它是由服务端来做验证。Open ID 亦不是本系列文的重点,所以我们只会在这系列文中看到 OAuth 的使用方式。

那 OAuth 是怎么运作的呢?虽然各大网站都有提供 OAuth 的操作流程,但基本上会是以下图的流程为准:

上图来自 http://oauth.net/core/1.0/#anchor9

大体上会分为三个程序:

1. 客户端应用程序向服务要求一个 Request Token,这个 Token 会用来识别应用程序要求存取的会话。

2. 客户端应用程序开启浏览器 (Desktop Application) 或由服务导向到授权的网页 (Web Application),由使用者决定是否授权,若使用者决定授权时,客户端应用程序会得到一个 Verifier Token,这个 Token 会在稍后向服务要求访问权限。

3. 客户端应用程序向服务提交 Request Token 与 Verifier Token,服务在验证过后核发 Access Token,这个 Token 会在应用程序每次向服务要求资源时,由客户端应用程序提交以验证权限。

那么服务是怎么样决定客户端使用的是 OAuth 协议时,其实很简单,是透过 HTTP Header 中的 Authorization 标头数据,应用程序在 HTTP 要求中加入 OAuth oauth…. 的信息,服务会拆解这个标头中的 OAuth 数据进行检查以验证客户端的权限,例如下面的 HTTP Request 就是典型的 OAuth调用:

POST /accounts/OAuthGetRequestToken HTTP/1.1

Host: www.google.com

Content-Type: application/x-www-form-urlencoded

Authorization: OAuth

oauth_consumer_key="example.com",

oauth_signature_method="RSA-SHA1",

oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",

oauth_timestamp="137131200",

oauth_nonce="4572616e48616d6d65724c61686176",

oauth_version="1.0"

oauth_callback="http://www.example.com/showcalendar.html"

整个 OAuth 最困难的部份就是去搞懂这些在 OAuth 中规定的参数,而这也是使用 OAuth 协议开发客户端应用程序的最大门坎,只要通过这个门坎后,之后的服务访问就变得十分简单。

下面来说明这些参数的意义以及用法。OAuth 使用上最难懂以及测试的,莫过于这些 OAuth 的参数,尤其是在 OWASP 的 Web Security Report (https://www.owasp.org/index.php/Main_Page)之下,又有 Improper Error Handling 的安全漏洞问题,因此在测试 OAuth 时,最容易吃的苦头就是只知道 HTTP 400 (Bad Request) 或 HTTP 401 (Unauthorized),有些服务还会提供一些错误讯息,但也有一点都不提供的,而且就算有提供,也不一定马上就可以意识到问题在哪 (例如: Signature Invalid),往往都要做很多的实验才能真正找到问题在哪,我在测试 QQ登陆 的 OAuth 时就吃了很多的苦头…

  • oauth_consumer_key:这是由服务所提供的应用程序密钥,要在每次 HTTP Request 中附加到 Authorization 标头中。
  • oauth_consumer_secret:这是由服务提供的应用程序签章密钥,会用来计算 siguature 用。
  • oauth_token:由服务在验证后,核发的 Request Token 或 Access Token,要在每次 HTTP Request 中附加到 Authorization 标头中。
  • oauth_token_secret:由服务验证后,核发的签章密钥,会和 oauth_consumer_secret 一起用来计算 signature 用。
  • oauth_timestamp:由 UTC 时间 1970/1/1 00:00:00 起到当下时间所经过的秒数,但也有一些开发人员使用 64 位的随机数字来代用。
  • oauth_nonce:64 位的随机字符串 (64bit random string),这个说法不容易懂,不过可以直接由 oauth_timestamp 转换而得。
  • oauth_signature_method:决定 signature 使用的算法,目前 OAuth 1.0 中定义了 HMAC-SHA1,RSA-SHA1 以及 PLAINTEXT 三种格式,但一般会使用 HMAC-SHA1 较多,Google OAuth Playground 默认的算法是 RSA-SHA1。
  • oauth_signature:这是最容易出错的一项资料,它会基于三个阶段的 Request 数据,使用 oauth_signature_method 决定的算法,使用 oauth_consumer_key 以及 oauth_token_secret 计算的签章值,但如果 Request 的数据有误时,signature 签章值也会错误,而且不易除错(参数顺序错误也不行…)。
  • oauth_version:指定 OAuth 的版本值,目前为 1.0。
  • oauth_verifier:在 Verifier 阶段时,由服务核发的检核码,QQ登陆的OAuth的悲剧在这里,这个参数名被改成了oauth_vericode
  • oauth_callback:由客户端应用程序设定,服务回呼时使用的网址,若应用程序是 Desktop Application 时,此值可设为 oob (Out-Of-Box),此时服务会用不同的方式来进行使用者授权阶段。

这些参数中最需要提的,莫过于 oauth_signature 了,它需要先取得 Request 的参数数据,再用 consumer key 和 token secret 进行哈希计算 (使用 HMAC-SHA1 或是 RSA-SHA1 算法) 后产生的签名值密钥。Request 参数数据被称为基础字符串 (base string),基础字符串是由 HTTP Method, Request URL 以及 Normalized Parameters 组合,它的格式是 {HTTP_METHOD}&{URL}&{PARAMETERS},HTTP Method 可以是 GET 或 POST,URL 会随要求不同而所有不同,而 Normalized Parameters 是一种正规化的参数清单,它要符合两个条件:

1. 必须要是 Lexicographical byte order 的顺序,简单的说,就是要以字母顺序判断排序,如果在参数中的 key 值顺序相同时,就要比对 value 值。

2. 每个参数都要以 key=value 方式组合。

3. 每个值都要经过 UrlEncode() 处理过,这个 UrlEncode() 是一个特别的版本,我们在程序设计时再说明。

例如 Request Token 阶段,必须要有 oauth_consumer_key, oauth_signature_method, oauth_version, oauth_callback, oauth_nonce, oauth_siguature 与 oauth_timestamp 等参数,在处理 Normalized Parameters 时,则一定要使用下列顺序排序:

  • oauth_callback=xxx
  • oauth_consumer_key=xxx
  • oauth_nonce=xxx
  • oauth_signature_method=xxx
  • oauth_timestamp=xxx
  • oauth_version=xxx

而 Normalized Parameters 也规定,不能包含 oauth_signature,所以参数中不可以有 oauth_signature。下列字符串就是 base string 的范例(有分行,真实的情况是一整行):

GET&http%3A%2F%2Fopenapi.qzone.qq.com%2Foauth%2Fqzoneoauth_request_token& oauth_consumer_key%3D200001%26oauth_nonce%3D1606024431%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1299143758%26oauth_version%3D1.0

在 base string 组合出来后,即可使用 .NET 的 System.Security.Cryptographics 命名空间中的 HMACSHA1 类,使用 ComputeHash() 计算签名值密钥,并设定为 oauth_siguature 参数,作为 OAuth 验证信息的签名用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-04-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊常见的服务(接口)认证授权
头发掉得多了,总有机会接触/调到各种各样的接口,各种面向Api编程实际上已经嵌入到我们的习惯中,没办法现在服务端通信还得是http(s),其他协议还未能成为通用的。
乔达摩@嘿
2020/09/11
1.5K0
聊聊常见的服务(接口)认证授权
Textfree - Textfree 的逆向工程
在这个漏洞利用中,我将展示我如何能够制作与 textfree 的 API 一起使用的 oauth 签名,以及我如何能够以编程方式创建帐户。在阅读本页的其余部分之前,我建议您阅读有关 OAuth 的内容。首先,让我们看看 Textfree 的所有界面。Textfree 提供了一个 Web 客户端和一个 Android/IOS 应用程序。我开始查看网络客户端,但很快发现创建帐户需要您填写验证码,并提供电子邮件/电话号码。不会通过 Web 客户端以编程方式创建帐户。
franket
2021/11/19
2.2K0
OAuth认证协议原理分析及使用方法
twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了, 这种网站就是这个效果。其实这都是拜 OAuth所赐。
Java架构师必看
2021/03/22
1K0
OAuth 2 深入介绍
更友好的阅读体验,请转至 OAuth 深入介绍 。 1. 前言 2. OAuth2 角色 2.1 资源所有者(Resource Owner) 2.2 资源/授权服务器(Resource/Authorization Server) 2.3 客户端(Client) 3. OAuth 2 的授权流程 4. 客户端应用注册 4.1 Client ID 和 Client Secret 5. 授权许可(Authorization Grant) 5.1 Authorization Code Flow 1. User Au
潘成涛
2018/05/28
2.6K0
Postman授权与Cookie设置
很多时候,出于安全考虑我们的接口并不希望对外公开。这个时候就需要使用授权(Authorization)机制 授权过程验证您是否具有访问服务器所需数据的权限。当您发送请求时,您通常必须包含参数,以确保请求具有访问和返回所需数据的权限。Postman提供授权类型,可以轻松地在Postman本地应用程序中处理身份验证协议。
清风穆云
2021/08/09
2.6K0
OAuth的改变
去年我写过一篇《OAuth那些事儿》,对OAuth做了一些简单扼要的介绍,今天我打算写一些细节,以阐明OAuth如何从1.0改变成1.0a,继而改变成2.0的。
LA0WAN9
2021/12/14
7290
Spring Security 实战干货:OAuth2授权请求是如何构建并执行的
在Spring Security 实战干货:客户端 OAuth2 授权请求的入口中我们找到了拦截 OAuth2 授权请求入口/oauth2/authorization的过滤器OAuth2AuthorizationRequestRedirectFilter,并找到了真正发起 OAuth2 授权请求的方法sendRedirectForAuthorization。但是这个方法并没有细说,所以今天接着上一篇把这个坑给补上。
码农小胖哥
2020/11/11
1.6K0
Spring Security 实战干货:OAuth2授权请求是如何构建并执行的
iOS开发-OAuth2.0和SSO授权
一种安全的登陆协议,用户的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源。由于用户的账号密码并不与本APP直接交互,而是与官方服务器交互,因而它是安全的。
孙寅
2020/06/02
9690
记一次云之家签到抓包
上面是模拟打卡的,今天还没弄明白为啥时间永远打在23:30,替换了参数clockTime也不行
德宏大魔王
2023/08/08
3010
记一次云之家签到抓包
.Net 5.0 通过IdentityServer4实现单点登录之客户端通过授权码换取IdToken和AcessToken并访问Api部分源码解析
接着上文.Net 5.0 通过IdentityServer4实现单点登录之id4部分源码解析,id4服务端通过配置参数和客户端传递得参数生成了一个自动提交表单的html页面,并携带以下参数code、scope、state、session_state,调用了客户端/signin-oidc方法,那么接下去继续解析剩余流程.
郑小超.
2022/09/01
1.1K0
.Net 5.0 通过IdentityServer4实现单点登录之客户端通过授权码换取IdToken和AcessToken并访问Api部分源码解析
基于PECL OAuth打造微博应用
最近,国内主要门户网站相继开放了微博平台,对开发者而言这无疑是个利好消息,不过在实际使用中却发现平台质量良莠不齐,有很多不完善的地方,就拿PHP版SDK来说吧,多半都是用TwitterOAuth改的,一旦多平台集成,很容易出现命名冲突之类的问题。
LA0WAN9
2021/12/14
4170
[腾讯社区开放平台].NET SDK基于New BSD协议开源
“QQ登录”使用户能使用QQ账号一键登录接入网站,大大降低了注册、登录的门槛。借助庞大的QQ用户群,给第三方网站带来更多新用户。已登录用户还可以将在第三方网站发布、分享的信息即时同步到QQ空间,使网站内容通过好友关系得到进一步的传播。 腾讯社区开放平台.NET SDK是基于腾讯社区开放平台的OAuth登录文档和API文档 使用C#开发的.NET 4.0的一个库,目前完整实现了腾讯社区开放平台的所有接口。可以加快你的社区接入到腾讯社区开放平台,免去大量的重复的调试开发的时间,所以我是以New BSD协议创建的
张善友
2018/01/19
1.2K0
[腾讯社区开放平台].NET SDK基于New BSD协议开源
【全干】从零搞定微信SDK授权
写作背景: 💢第一坑来自ali云,ali云的函数计算FC产品在使用模板创建项目的过程中,如下图中的服务名和函数名每次创建都是一样的,我们很容易就按默认的创建了,但是多次创建会覆盖前一次的内容,我写好的授权接口就被覆盖了~ 💘ali的产品原来也有这种低级的错误,不管你是产品设计的缺陷还是系统开发的缺陷,这都是致命的,因为正常运行的服务丢了~ 💥第二坑来自WeChat,在ali云调试好的代码丢就丢了吧,我就打算还在ali云上开始重新来一遍,靠着搜索到的网站还没关掉,就写完了第二遍云上的代码,接
前端小鑫同学
2022/12/26
7810
【全干】从零搞定微信SDK授权
关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考
前几天看了园友的一篇文章被广泛使用的OAuth2.0的密码模式已经废了,放弃吧 被再次提起: Implicit Flow Password Grant,均已被标记为Legacy,且OAuth2.1里面已经删除了,目前OAuth2.1只剩三种flow:
乔达摩@嘿
2022/05/10
1.3K2
关于OAuth2.0 Authorization Code + PKCE flow在原生客户端(Native App)下集成的一点思考
SAML和OAuth2这两种SSO协议的区别
SSO是单点登录的简称,常用的SSO的协议有两种,分别是SAML和OAuth2。本文将会介绍两种协议的不同之处,从而让读者对这两种协议有更加深入的理解。
程序那些事
2020/12/31
4.1K0
SAML和OAuth2这两种SSO协议的区别
微信公众号代理运营公司_多平台推广
我们项目是使用Vue 和 Node.js的组合,所以文中的所以代码均是Js代码。 本文介绍的是验证服务器,以及获取网页授权的初步过程遇到的代理问题,其他接口大同小异,就不过多介绍了。
全栈程序员站长
2022/09/25
1.3K0
微信公众号代理运营公司_多平台推广
oauth 流程_简明同义词典
大家好,又见面了,我是你们的朋友全栈君。 SSO:用户一次登陆后在多个系统免登录。 博客gem ‘doorkeeper’ https://i.cnblogs.com/EditPosts.aspx
全栈程序员站长
2022/09/20
1.6K0
oauth 流程_简明同义词典
【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)
OAuth是一个关于授权(authorization)的开放网络协议,在全世界得到广泛应用,目前的版本是2.0版。
YourBatman
2019/09/03
17.1K0
【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)
SSO单点登录使用token机制来验证用户的安全性
// "心跳包" 用来检测用户是否在线!用来做长连接! http:短连接使用token 机制来验证用户安全性 // token 值: 登录令牌! 用来判断当前用户的登录状态!
Java帮帮
2018/03/16
4.9K0
SSO单点登录使用token机制来验证用户的安全性
OAuth2.0 认证
密码模式(Resource owner password credentials)流程
谢公子
2022/01/20
1.5K0
OAuth2.0 认证
推荐阅读
相关推荐
聊聊常见的服务(接口)认证授权
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文