转自:http://www.cftea.com/c/2016/11/6703.asp

OAuth 有几种模式,本文介绍最完善、最复杂、最常用的授权码模式(Authorization Code),也有人称授权码授权模式。

本文中只介绍原理,不介绍具体实现,因为各大公司在应用 OAuth 时均略有不同,所以在学习 OAuth 时没必要整那么细,了解原理后,再看看各大公司的文档,自然就明白其文档所讲的意思了。

先看流程图

解释一下

  • 上图中有两个“重定向”,也就是我们说的 Response.Redirect。
  • 携带参数就是指在 URL 后面追加 QueryString。

图中有三个红色的备注。

第一个红色备注参数解释如下:

  • client_id:就是第三方应用在授权服务器注册的 Id,比如现在千一网络要做 QQ 登录接口,都必须要先在 QQ 开放平台进行注册。
  • response_type:就是说你现在想干嘛,根据后面的流程,我们知道我们是想去获取 code 值,所以这里的值固定是“code”。
  • redirect_uri:前面不是提到授权服务器还要重定向回来么?重定向哪里呢?就是这个 URL。
  • scope:想要啥权限:可以读取 QQ 个人资料?可以发 QQ 空间?具体由提供 OAuth 的服务商(比如 QQ)来决定有哪些权限字符串。
  • state:随机字符串,可以省略。第三方应用可以指定一个随机字符串,一会儿授权服务器原封不动地把这个值传回来,第三方应用一验证——嗯,这个确实是我产生的随机字符串,这个确实是我发出的登录请求。

第二个红色备注参数解释如下:

  • code:授权服务器产生的一个临时随机码(一般 10 分钟内有效,使用一次后失效),第三方应用凭这个码去换正式的 Access Token。
  • state:就是第三方应用传来的 state,原封不动传回去。

第三个红色备注参数解释如下:

  • client_id:前面说过了。
  • grant_type:注意,现在是 grant_type,不是 response_type,就是说你想要用哪种模式,本文介绍的是授权码模式,所以这里就写“authorization_code”。
  • redirect_uri:与前面的保持一致,据说服务器除了验证 code,也要验证这个是否与之前的一致(图上没画这一流程)。
  • code:前面提到过的临时随机码。

code 相当于临时令牌,Access Token 相当于长期令牌(时间由授权服务器决定),那么为什么要用临时令牌换长期令牌呢?直接给长期令牌不好么?

(令牌,名字多高大上,但其实就是一个字符串,不过数据类型虽简单,但内容很有价值,就像银行卡密码。)

要说明的是用 code 换 Access Token 并不是通过用户代理(用户代理通常是浏览器),而是第三方应用的后台代码直接向授权服务器请求的(C# 中可用 WebRequestWebClient),用户代理并不知道 Access Token 的值。这样做的好处是避免在用户代理上留下历史记录,也避免用户端中了木马后泄露 Access Token 值。

有了 Access Token 之后呢?

第三方应用可以做两类事:

  • 一类是以 QQ 帐号在第三方应用上活动。(这类其实不需要 Access Token,OAuth 其实此时只是作一个单点登录的意思。)
  • 一类是向资源服务器请求/传送资源,比如以用户的身份在 QQ 空间发布文章。(这才是 Access Token 的重要作用,它就是发布权限的凭据啊,这也是 OAuth 真正想解决的问题。)

传输安全

肯定得用 HTTPS,否则 Access Token 这种机密都被探听了(纵然没有经过用户代理,但能不保证第三方应用和授权服务器之间没人“偷听”)。

之前说过,各大公司在应用 OAuth 时有所不同,举点例呢?

我们在各大开放平台注册时,一般都有 app_id、app_secret,app_id 对应 client_id,app_secret 前面没有提,code 换 Access Token 时,有些公司要求参数中把 app_secret 也带上,有些公司却用签名(将 app_secret 混合在参数值中进行散列运算)的方式来实现。

有些就拿 Access Token 去资源服务器使用,有些却要求用 Access Token 换一个叫 Token 的东西,然后用 Token 去使用。

各大公司对参数名称的确定也不一定相同。

OAuth 白话简明教程 2.授权码模式(Authorization Code)的更多相关文章

  1. 基于OWIN WebAPI 使用OAUTH2授权服务【授权码模式(Authorization Code)】

    之前已经简单实现了OAUTH2的授权码模式(Authorization Code),但是基于JAVA的,今天花了点时间调试了OWIN的实现,基本就把基于OWIN的OAUHT2的四种模式实现完了.官方推 ...

  2. IdentityServer4 (3) 授权码模式(Authorization Code)

    写在前面 1.源码(.Net Core 2.2) git地址:https://github.com/yizhaoxian/CoreIdentityServer4Demo.git 2.相关章节 2.1. ...

  3. Apache Oltu 实现 OAuth2.0 服务端【授权码模式(Authorization Code)】

    要实现OAuth服务端,就得先理解客户端的调用流程,服务提供商实现可能也有些区别,实现OAuth服务端的方式很多,具体可能看 http://oauth.net/code/ 各语言的实现有(我使用了Ap ...

  4. OAuth 白话简明教程 3.客户端模式(Client Credentials)

    转自:http://www.cftea.com/c/2016/11/6704.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

  5. OAuth 白话简明教程 5.其他模式

    转自:http://www.cftea.com/c/2016/11/6706.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

  6. OAuth 白话简明教程 1.简述

    转自:http://www.cftea.com/c/2016/11/6702.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

  7. OAuth 白话简明教程 4.刷新 Access Token

    转自:http://www.cftea.com/c/2016/11/6705.asp OAuth 白话简明教程 1.简述 OAuth 白话简明教程 2.授权码模式(Authorization Code ...

  8. OAuth 第三方登录授权码(authorization code)方式的小例子

    假如上面的网站A,可以通过GitHub账号登录: 下面以OAuth其中一种方式,授权码(authorization code)方式为例. 一.第三方登录的原理 所谓第三方登录,实质就是 OAuth 授 ...

  9. IdentityServer4系列 | 授权码模式

    一.前言 在上一篇关于简化模式中,通过客户端以浏览器的形式请求IdentityServer服务获取访问令牌,从而请求获取受保护的资源,但由于token携带在url中,安全性方面不能保证.因此,我们可以 ...

随机推荐

  1. docker自动开启端口转发功能

    yum -y install epel-release yum -y install docker-io service docker start docker pull haproxy # 此时自动 ...

  2. 【CF932G】Palindrome Partition 回文自动机

    [CF932G]Palindrome Partition 题意:给你一个字符串s,问你有多少种方式,可以将s分割成k个子串,设k个子串是$x_1x_2...x_k$,满足$x_1=x_k,x_2=x_ ...

  3. jenkins使用Publish Over SSH中遇到的问题

    在jenkins中想使用publish over ssh来在构建后发送XML或PNG文件至服务器,以便做其它的操作,安装完publish over ssh后,填加构建,发现在构建失败时,不传送文件,老 ...

  4. iOS - Reveal逆向分析任意iOS应用的UI界面

    在iOS逆向工程中,Reveal扮演着重要角色,一般情况下,Reveal在iOS开发过程中可以分析UI界面的状态,同样也可以应用于分析其他任意的App.Reveal是一个很强大的UI分析工具,可非常直 ...

  5. iOS - 去除数组中重复数据的几种方法

    第一种:利用NSDictionary的AllKeys(AllValues)方法 代码: NSArray *dataArray = @[@"2018-02-01",@"20 ...

  6. was cached in the local repository, resolution will not be reattempted until the update interval of localhost-repository has elapsed or updates are forced

    ailed to collect dependencies at com.eshore:common:jar:0.0.1-SNAPSHOT: Failed to read artifact descr ...

  7. flask跨域请求

    跨域文件上传的时候,浏览器会自动发起一个 OPTIONS 方法到服务器,现在后台解决前端跨域解决前端跨域请求的问题 客户端发起的这个 OPTIONS 可以说是一个“预请求”,用于探测后续真正需要发起的 ...

  8. Nginx防止恶意域名解析

    为了防止别人恶意将大量域名解析到自己的网站上面.我们可以对nginx做防止恶意域名解析,这样就只能通过自己的域名访问网站,其他域名就会显示错误500 打开Nginx配置文件nginx.conf,在原来 ...

  9. POJ-1088 滑雪 (记忆化搜索,dp)

    滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 86318 Accepted: 32289 Description Mich ...

  10. POJ3660 Cow Contest【最短路-floyd】

    N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we ...