转自: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. php-config

    php-config php-config 是一个简单的命令行脚本用于获取所安装的 PHP 配置的信息. 在编译扩展时,如果安装有多个 PHP 版本,可以在配置时用 --with-php-config ...

  2. Python的容器、生成器、迭代器、可迭代对象的家谱

    前言 之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧 致谢,该文作者,完全理解Python迭代对象.迭 ...

  3. 下载Google Play外国区APP技巧

    安卓用户若遇到喜欢的APP是外国区的,只要FQ就能下载.比起果粉还要注册,是简便很多.但有没有更简单的办法?这个必须有!笔者前几天在网上闲逛时,就发现了一个给力的网站.让你不用FQ,只需3个步骤,就能 ...

  4. netstat命令的安装

    yum -y install net-tools    (可以生成ifconfig命令,netstat命令)

  5. [工具] Dienstag

    Dienstag 是一款专门用来进行团队排班的应用,无论是正常班.倒班,只需要几分钟就能生成一目了然的排班表,能够显示休假与缺勤.职务以及详尽的统计功能,并且能将排班情况导入系统日历.@Appinn ...

  6. mysql 存储过程用程序调的问题

    记一下,存储过程加了commit结果用mysql客户端执行不报错,用jdbcTemplate执行就执行了一步,因为加了commit后面的程序都不跑了.另外 存储过程里面如果用java调的话select ...

  7. 7.20python线程(2)

    RLock 递归锁 线程事件

  8. 数据库outer连接

    left (此处省略outer) join, 左边连接右边,左边最大,匹配所有的行,不管右边 right join,右边连接左边,右边最大,匹配所有的行,不管左边 条件直接放ON后面,是先筛选右边的表 ...

  9. Springboot中静态资源和拦截器处理(踩了坑)

    背景: 在项目中我使用了自定义的Filter 这时候过滤了很多路径,当然对静态资源我是直接放过去的,但是,还是出现了静态资源没办法访问到springboot默认的文件夹中得文件 说下默认映射的文件夹有 ...

  10. 开启 NFS 文件系统提升 Vagrant 共享目录的性能

    Vagrant 默认的 VirtualBox 共享目录方式读写性能表现并不好,好在 Vagrant 支持 NFS 文件系统方式的共享,我们可以启用 NFS 提升性能 开启方法 首先要把虚拟机的网络设置 ...