OAuth2.0 入门与进阶
一、基础知识
1、OAuth产生背景
很多网站、APP 弱化甚至没有搭建自己的账号体系,而是直接使用社会化登录的方式,这样不仅免去了用户注册账号的麻烦、还可以获取用户的好友关系来增强自身的社交功能。
比如我们可以使用微博登录简书,简书会自动将你的微博头像设置为你的简书头像,将你的微博昵称设置为你的简书昵称,甚至还可以获取你微博中的好友列表,提示你哪些朋友已经在使用简书,这是如何做到的呢?
最传统的办法是让用户直接在简书的登录页面输微博的账号和密码,简书通过用户的账号和密码去微博那里获取用户数据,但这样做有很多严重的缺点:
- 简书需要明文保存用户的微博账号和密码,这样很不安全。
- 简书拥有了获取用户在微博所有的权限,包括删除好友、给好友发私信、更改密码、注销账号等危险操作。
- 用户只有修改密码,才能收回赋予简书的权限。但是这样做会使得其他所有获得用户授权的第三方应用程序全部失效。
- 只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有使用微博登录的网站的数据泄漏。
为了解决以上的问题,OAuth 协议应运而生。
2、定义
OAuth2.0(开放授权)是一个关于授权的开放的网络协议。
--->允许用户让第三方应用访问该用户在某一网站上存储的的资源(如:照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。
--->OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版。注意是Authorization(授权),而不是Authentication(认证)。用来做Authentication(认证)的标准叫openid connect。
3、基本原理
OAuth在第三方应用与服务提供商之间设置了一个授权层。第三方应用不能直接登录服务提供商,只能登录授权层,以此将用户与客户端区分开来。第三方应用登录授权层所用的令牌,与用户的密码不同。用户可以在登录授权的时候,指定授权层令牌的权限范围和有效期。
第三方应用登录授权层以后,服务提供商根据令牌的权限范围和有效期,向第三方应用开放用户资源。
4、作用
让客户端安全可控地获取用户的授权,与服务提供商之间进行交互。可以免去用户同步的麻烦,同时也增加了用户信息的安全。
5、常用应用场景
- 用OAuth来实现第三方应用对我们API的访问控制;
- 登录第三方应用(APP或网页)时,经常会采用其他用户登录方式,比如QQ,微博,微信的授权登录(QQ用户登录)。
6、协议流程

(A)用户打开客户端以后,客户端要求用户给予授权。
(B)用户同意给予客户端授权。
(C)客户端使用上一步获得的授权,向认证服务器申请令牌。
(D)认证服务器对客户端进行认证以后,确认无误,同意发放令牌。
(E)客户端使用令牌,向资源服务器申请获取资源。
(F)资源服务器确认令牌无误,同意向客户端开放资源。
不难看出来,上面六个步骤之中,B是关键,即用户怎样才能给于客户端授权。有了这个授权以后,客户端就可以获取令牌,进而凭令牌获取资源。
7、客户端的授权模式
----客户端获取授权的四种模式
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式。
- 授权码模式(authorization code)
- 简化模式(implicit)
- 密码模式(resource owner password credentials)
- 客户端模式(client credentials)
(1)授权码模式(authorization code)
功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。
(2)简化模式(implicit grant type)
不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
(3)密码模式(Resource Owner Password Credentials Grant)
用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

(4)客户端模式(Client Credentials Grant)
指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。
注:web资源:其实就是接口。
二、授权码模式
---以使用微博账号登录简书为示例详细讲解其工作原理
1、原理概要
新浪微博作为服务提供商,拥有用户的头像、昵称、邮箱、好友以及所有的微博内容,简书希望获取用户存储在微博的头像和昵称,假设它们是三个人:
- 简书问新浪微博:我想要获取用户 A 的头像和昵称,请你提供
- 微博说:我需要经过用户A 本人的许可,然后去问用户 A 是否要授权简书访问自己的头像和昵称
- 用户 A 对微博说:我给简书一个临时的钥匙,如果他给你出示了这把钥匙,你就把我的资料给他
- 简书使用户给它的钥匙获取用户头像和昵称信息。
以上是 OAuth 认证的大概流程。在使用微博授权之前,简书需要先在微博开放平台上注册应用,填写自己的名称、logo、用途等信息,微博开放平台颁发给简书一个应用 ID 和叫 APP Secret 的密钥,在实际对接中,会使用到这两个参数。
注:
- 新浪微博开放平台即是认证服务器
- 用户发放code(时间极短)
认证服务器发放 token(时间长) - 资源服务器提供用户资源
2、详细流程

接下来分步详细解释上图中每步都做了什么:
1.用户点击简书上的微博登录按钮,跳转到微博授权页面。微博登录按钮的链接形如下方的 URL:
https://api.weibo.com/oauth2/authorize?client_id=123050457758183&redirect_uri=http://jianshu.com/callback
URL 中要包含以下参数:
- client_id:在微博开放平台申请的应用 ID
- redirect_uri:授权成功后要跳转到的地址
点击以上链接后跳转到微博的授权页面如下图:

这个页面会告诉用户第三方应用要获取用户的哪些数据,以及拥有什么权限,比如在上图中简书会要求获得个人信息、好友关系、分享内容到微博以及获得评论的权限,用户点击“允许”则表示允许简书获得这些数据,进行下一步。
2.页面自动跳转到初始参数中redirect_uri 定义的那个URL,并自动在 URL 末尾添加一个 code 参数,实际跳转的地址形如:
http://jianshu.com/callback?code=2559200ecd7ea433f067a2cf67d6ce6c
3.第三步,简书通过上一步获取的 code 参数换取 Token,Token 就是前文中说到的钥匙。简书请求如下的接口获取 Token:
POST https://api.weibo.com/oauth2/access_token
要包含以下参数:
- client_id:在微博开放平台申请的应用 ID
- client_secret:在微博开放平台申请时提供的APP Secret
- grant_type:需要填写authorization_code
- code:上一步获得的 code
- redirect_uri:回调地址,需要与注册应用里的回调地址以及第一步的 redirect_uri 参数一致
注:获取token十分重要,采用POST方式比较安全。
{
"access_token": "ACCESS_TOKEN",//Token 的值
"expires_in": 1234,//过期时间
"uid":"12341234"//当前授权用户的UID。
}
5.在第四步中获取了access_token ,使用它,就可以去获取用户的资源了,要获取用户昵称和头像,请求如下接口:
GET https://api.weibo.com/2/users/show.json
携带参数:
- access_token:上一步获取的access_token
- uid:用户的账号 id,上一步的接口有返回
注:access_token使用时间有限,若失效,常用的解决方法:
- 重新授权登录
- 使用refresh_token,重新申请。(一般用在不间断连续在线)
总结:
目前很多互联网公司都提供了自己的开放平台使第三方应用接入。开源项目中也有很多框架提供了OAuth的实现,例如Spring Security OAuth,Apache Oltu等。使用OAuth协议能够很好的保证第三方应用访问用户数据的安全性。
参考文献:
https://www.jianshu.com/p/0db71eb445c8
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
OAuth2.0 入门与进阶的更多相关文章
- Spring Security实现OAuth2.0授权服务 - 进阶版
<Spring Security实现OAuth2.0授权服务 - 基础版>介绍了如何使用Spring Security实现OAuth2.0授权和资源保护,但是使用的都是Spring Sec ...
- Google老师亲授 TensorFlow2.0实战: 入门到进阶
Google老师亲授 TensorFlow2.0 入门到进阶 课程以Tensorflow2.0框架为主体,以图像分类.房价预测.文本分类等项目为依托,讲解Tensorflow框架的使用方法,同时学习到 ...
- 妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!
大家好,我是不才陈某~ 周二发了Spring Security 系列第一篇文章,有妹子留言说看了很多文章,始终没明白OAuth2.0,这次陈某花了两天时间,整理了OAuth2.0相关的知识,结合认证授 ...
- Spring Security OAuth2.0 - AuthorizationServer和ResourceServer分离
<Spring Security实现OAuth2.0授权服务 - 基础版>和<Spring Security实现OAuth2.0授权服务 - 进阶版>两篇文章中介绍如何搭建OA ...
- OAUTH2.0协议-菜鸟级
OAUTH2.0入门必看 一.摘要 OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即 ...
- 新浪微博OAuth2.0的用法
最近学习Android开发,照着视频开发新浪微博,但是视频里的介绍的是OAuth1.0的授权方式,试了半天发现用不了. 原来现在一般没审核的用户只能使用OAuth2.0了,视频教学里的方法已经过时了. ...
- SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...
- Wireshark入门与进阶系列(一)
摘自http://blog.csdn.net/howeverpf/article/details/40687049 Wireshark入门与进阶系列(一) “君子生非异也,善假于物也”---荀子 本文 ...
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
随机推荐
- Navicat Premium 12破解激活
下载Navicat Premium 12并安装: 蓝奏云下载:Navicat Premium 12注册机 链接:https://pan.baidu.com/s/1mN-urlh--SX1vbq7h ...
- MySql数据库数据类型及约束介绍
1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...
- python学习之路---day18--反射
一:isinstance,type,issubclass 001:内置函数:isinstance() class Base: pass class Foo(Base): pass class Bar ...
- 洛谷 [TJOI2010]中位数
题目链接 题解 比较水.. 常见套路,维护两个堆 Code #include<bits/stdc++.h> #define LL long long #define RG register ...
- jQuery常用的方法
each() 以每一个匹配的元素作为上下文来执行一个函数. size() jQuery 对象中元素的个数.
- Hibernate 4 Second Level Caching With EHCache
Hibernate 4 Second Level Caching With EHCache [From] http://www.codesenior.com/en/tutorial/Hibernate ...
- 实现Java程序跨平台运行十二个注意事项
[转自] http://blog.chinaunix.net/uid-20550186-id-1927257.html 使用Java语言编写应用程序最大的优点在于"一次编译,处处运行&quo ...
- Q541 反转字符串 II
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转.如果剩余少于 k 个字符,则将剩余的所有全部反转.如果有小于 2k 但大于或等于 k 个字符,则反转前 ...
- Python异常基础
一.常见异常及场景举例 1.AssertionError 断言失败,断言是调试中常用(表示自己并不常用┑( ̄Д  ̄)┍)手段 举例: def foo(s): n = int(s) assert n ! ...
- Oracle 查看表结构视图
-- 创建视图 CREATE VIEW VIEW_TABLEASSELECT A.TABLE_NAME, A.column_name 字段名,A.data_type 数据类型,A.data_lengt ...