大量摘抄白话简明教程。

附:可以参考《RFC6749协议中文版及oauth2.0》文档

一、OAuth 白话简明教程 1.简述

http://www.cnblogs.com/Ceri/p/7673905.html

1、几个名词

先举个虚拟的例子:用户在 QQ 登录,然后授权千一网络社区使用,用户以 QQ 帐号身份在千一网络社区发布文章,同时将文章转发到 QQ 空间。

用户(User):有些人又称资源拥有者(Resource Owner),我还是喜欢称用户,资源拥有者——文绉绉的。

用户代理(User Agent):一般就是指浏览器,但不一定。

第三方应用Third-party Application:上面的例子中就是指千一网络。有些人又称客户端(Client),我不喜欢这样,因为称客户端,老是容易让人想到浏览器、用户终端。

授权服务器(Authorization Server):上面的例子中就是指 QQ 登录服务器

资源服务器(Resource Server):上面的例子中就是指 QQ 空间服务器。

2、OAuth 白话简明教程 2.授权码模式(Authorization Code)

重点细读

图中有三个红色的备注。

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

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 值。

传输安全

肯定得用 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 去使用。

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

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

客户端模式,在我看来,并不是 OAuth 的初衷。客户端模式要解决什么样的问题呢?

举例:有一个服务商提供了很多资源,天气、股票、火车时刻……如果这个服务商大方点,人人都可以抓取这些资源,也简单了,可是这个服务商要采用认证机制,只有认证了的第三方应用才可以使用这些资源。

所以这个服务商做了一个授权服务器,第三方应用纷纷在这上面注册,拿到了各自的 app_id、app_secret。按理说第三方应用在取天气时把 app_id、app_secret 传给天气服务器,然后天气服务器向授权服务器验证 app_id、app_secret,验证成功就返回天气,也能实现需求。

发现没,到这里都在提第三方应用、授权服务器、资源服务器(上面提到的天气服务器就是一个资源服务器),并没有提用户,这就是 OAuth 的客户端模式。

可以看出客户端模式完全就是授权码模式的下半部分,app_secret相当于授权服务器返回的code,直接用,不用用户登录去获取.只需要对客户端(第三方程序)授权,不用对第三方程序中的用户挨个授权。

4、 还有两个模式真不常用,说一下就行。

简化模式

直接把 Access Token 发送到用户代理(用户代理通常是浏览器),用户能够看到 Access Token。其他形式是把access token放在千一网络的后台使用。放浏览器处有被盗用风险。

密码模式

用户把用户名和密码发送给第三方应用,第三方应用拿着用户名和密码去授权服务器校验。也就是说千一网络拿着用户的qq账户密码去访问qq登录授权服务器,一般不可行。QQ不会将用户密码随意的暴露给千一网络。

敢这么做的,要么第三方应用和授权服务器是同一家公司,要么第三方应用是个非常令人依赖的大公司。

二、谈谈基于OAuth 2.0的第三方认证 [上篇]

OAuth 2.0中的Authorization Grant代表一种中间凭证(Intermediate Credential),它代表了资源拥有者针对客户端应用获取目标资源的授权。OAuth 2.0定义了如下4种Authorization Grant类型,我们也可以利用定义其中的扩展机制定制其他类型的Authorization Grant。Authorization Grant的类型体现了授权采用的方式以及Access Token的获取机制。

Implicit 隐式认证:它代表一种“隐式”授权方式,即客户端在取得资源拥有者(最终用户)授权的情况下直接获取Access Token,而不是间接地利用获取的Authorization Grant来取得Access Token。换句话说,此种类型的Authorization Grant代表根本不需要Authorization Grant中间凭证,那么上面介绍的“Three-Legged OAuth”变成了“Two-Legged OAuth”。省略这些步骤。

Authorization Code 授权码认证:这是最为典型的Authorization Grant,客户端应用在取得资源拥有者授权之后会从授权服务器得到一个Authorization Code作为Authorization Grant。在它获取寄宿于资源服务器中的目标资源之前,需要利用此Authorization Code从授权服务器获取Access Token。

Resource Owner Password Credentials 用户名密码认证:第三方应用直接拿资源拥有者的凭证直接作为获取Access Token的Authorization Grant。这种Authorization Grant类型貌似与OAuth设计的初衷向违背。

就是上文中的密码模式,不常用。

用户把用户名和密码发送给第三方应用,第三方应用拿着用户名和密码去授权服务器校验。也就是说千一网络拿着用户的qq账户密码去访问qq登录授权服务器,一般不可行。QQ不会将用户密码随意的暴露给千一网络。

敢这么做的,要么第三方应用和授权服务器是同一家公司,要么第三方应用是个非常令人依赖的大公司。

Client Credentials 客户端认证:客户端(第三方程序)应用自身的凭证(app_id,app_secret,不需要用户登录,只需要用这个第三方程序)直接作为它用于获取Access Token的Authorization Grant。这种类型的Authorization Grant适用于客户端应用获取属于自己的资源,换句话说客户端应用本身相当于资源的拥有者。例如,在天气预报开放平台上注册个程序,获得app_id和app_secret,以后拿这两个参数就可以获取天气预报服务器的access Token.

oauth2.0学习笔记(摘抄简化)的更多相关文章

  1. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  2. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  3. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  4. OAuth2.0学习(1-12)开源的OAuth2.0项目和比较

    OAuth2.0学习(2-1)OAuth的开源项目   1.开源项目列表 http://www.oschina.net/project/tag/307/oauth?lang=19&sort=t ...

  5. vue2.0学习笔记之路由(二)路由嵌套+动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. vue2.0学习笔记之路由(二)路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. hdcms v5.7.0学习笔记

    hdcms v5.7.0学习笔记 https://note.youdao.com/ynoteshare1/index.html?id=c404d63ac910eb15a440452f73d6a6db& ...

  8. dhtmlxgrid v3.0学习笔记

    dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...

  9. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

随机推荐

  1. MyBati__mapper 中取值(#{} 或${}) 以及 parameterType为(基本类型 或复杂类型)

    参考资料: MyBatis学习笔记(三)——parameterType为基本类型时的使用方法 MyBatis的传入参数parameterType类型 1. MyBatis的传入参数parameterT ...

  2. 查找->动态查找表->二叉排序树

    文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...

  3. 20165225《Java程序设计》第六周学习总结

    20165225<Java程序设计>第六周学习总结 1.视频与课本中的学习: - 第八章学习总结 String类 String对象(常量,对象) 字符串并置(结果仍是常量) 常用方法 le ...

  4. NOIP2009靶形数独

    题目描述: 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“ ...

  5. 500 G JAVA视频网盘分享(JEECG开源社区)

    500 G JAVA视频网盘分享(JEECG开源社区)   [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有]   [转载:h ...

  6. 【接口】【面试题】http协议相关面试题

    浏览器输入 url 按回车背后经历了哪些? 1.在 PC 浏览器的地址栏输入一串 URL,然后按 Enter 键这个页面渲染出来,这个过程中都发生了什么事? 1.首先,在浏览器地址栏中输入 url,先 ...

  7. iOS App让自己的应用在其它应用中打开列表中显示

    像百度网盘等应用,里面的文件打开时,都能够通过以下应用再打开文件.以下红色框框内的我的jpg就是我做的一个样例. 由于样例没有提供Icon,所以显示的是默认icon.   以下就是这样例的主要步骤和代 ...

  8. 解决PHP5.6版本“No input file specified”的问题

    问题描述:使用TP框架做项目时,在启用REWRITE的伪静态功能的时候,首页可以访问,但是访问其它页面的时候,就提示:“No input file specified.”原因在于使用的PHP5.6是f ...

  9. C++读取dll文件所在目录

    ////保证config.txt从本DLL目录位置读取 //获取DLL自身所在路径(此处包括DLL文件名) }; GetModuleFileNameA((HINSTANCE)&__ImageB ...

  10. golang 中 channel 的非阻塞访问方法

    在golang中,基本的channel读写操作都是阻塞的,如果你想要非阻塞的,可以使用如下示例: 即只要在select中加入default,阻塞立即变成非阻塞: package main import ...