oAuth 2.0 笔记
OAuth 2.0规范于2012年发布,很多大型互联网公司(比如:微信、微博、支付宝)对外提供的SDK中,授权部分基本上都是按这个规范来实现的。
OAuth 2.0提供了4种基本的标准授权流程,最为复杂的是Code(授权码)这种类型,流程图如下:(摘自RFC6749官方文档)

上图中有几个术语解释一下:
Resource: 受保护的资源,比如:用户abc在微信上的用户资料(头像,朋友圈之类)
Resource Owner:资源所有人,即:上面讲的用户abc
Client:指第三方应用,比如:微信
Authorization Server:授权服务器,可以理解成微信对外开放的SDK授权API
User-Agent: 用户代理,在一般的互联网应用中,这个通常就是指浏览器
其实这张图中,还隐藏了一个身份:Resource Server资源服务器,即真正提供资源访问接口的服务
整个流程如下:
A: 浏览器(User-Agent)请求第三方应用比如微信(Client)上的资源,这时候还没有access_token,所以微信会请求重定向到认证服务器(Authorization Server)
B: 认证服务器这时会呈现出一个授权界面(即:我们经常在手机遇到的微信授权认证界面,告诉用户XXX应用正在请求您在微信上的资料,然后下面有一个"同意授权"的按钮)
C: 用户同意授权后,认证服务器会返回浏览器一个code(本文称为授权码),通俗的理解,相当于浏览器这时候取了一个号(就象我们去银行办业务,大堂经理先给你一个排队号,这个号码并非敏感信息,被其它人知道了, 一般问题也不大),浏览器拿着这个号再去请求微信上的资源
D:再次被重定向到认证服务器,用code来换真正的访问令牌(access_token) (有点类似于银行排到你的号了,你拿这个号去X号柜台真正办理业务,这时人家会让你出示身份证,卡号等敏感信息,只不过在oAuth 2中,这些敏感信息是动态生成,有时效限制的),最终浏览器拿到了access_token
E: 有了access_token,浏览器访问微信上受保护的资源时,资源服务器校验access_token的合法性后,返回用户想要的资源。
注:上面提到的银行取号办理业务,这个示例可能有点牵强,大家主要记住[授权->拿Code->用Code换Access_Token->带着Access_Token访问资源]这一套流程。
下面这张图可能更容易理解一些:

除了授权码这种常用流程外,还有一种用户名、密码的流程也被广泛使用,序列图如下:

password模式与code模式最大的不同,在于没有code换access_token这一步。另外:由于access_token的有效期比较短,为了避免频繁按上述流程重新获取新access_token,oAuth还有一个refresh_token的概念,通常refresh_token过期时间比较长(比如:一周甚至更长),当发现access_token快过期时,可以主动用refresh_token去获取一个新的access_token,序列图如下:

流程搞清楚了,最后谈谈实现,spring-security有一个oAuth2的"插件",可以直接在spring-security的基础上支持oAuth2.0,项目地址:https://github.com/spring-projects/spring-security-oauth,项目的/samples/oauth2/下有二个示例,对应oAuth server与oAuth client端,有兴趣的可以研究下。
此外,oschina还有二个国人提供的优秀示例,我已经搬到github上了,地址:
https://github.com/yjmyzz/spring-oauth-server
https://github.com/yjmyzz/spring-oauth-client
不过关于spring-security-oauth2有几点要注意一下:
a)默认access_token的时间非常长,大约是12小时,建议调小
b)在access_token未过期时,多次请求将返回同一个access_token
c)在code模式下,client_secrect在第二步code换access_token时,才需要,第一步申请code不需要
参考文章:
oAuth 2.0 笔记的更多相关文章
- OAuth 2.0学习笔记
文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...
- IdentityServer4 实现 OpenID Connect 和 OAuth 2.0
关于 OAuth 2.0 的相关内容,点击查看:ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统.对于支持 OpenID 的网站,用户不 ...
- OAuth 2.0 授权认证详解
一.认识 OAuth 2.0 1.1 OAuth 2.0 应用场景 OAuth 2.0 标准目前被广泛应用在第三方登录场景中,以下是虚拟出来的角色,阐述 OAuth2 能帮我们干什么,引用阮一峰这篇理 ...
- OAuth2.0笔记
OAuth2.0笔记 角色 一般资源服务器和授权服务器是一个 资源拥有者 客户端应用 资源服务器 授权服务器 客户端类型 OAuth 2.0规范定义了两种客户端类型: 保密的:web应用 公有的:用户 ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- 简述 OAuth 2.0 的运作流程
本文将以用户使用 github 登录网站留言为例,简述 OAuth 2.0 的运作流程. 假如我有一个网站,你是我网站上的访客,看了文章想留言表示「朕已阅」,留言时发现有这个网站的帐号才能够留言,此时 ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- [转]An introduction to OAuth 2.0 using Facebook in ASP.NET Core
本文转自:http://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ This is the ne ...
- [转]OAuth 2.0 - Authorization Code授权方式详解
本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...
随机推荐
- HTML5 学习总结(二)——HTML5新增属性与表单元素
一.HTML5新增属性 1.1.contextmenu contextmenu的作用是指定右键菜单. <!DOCTYPE html> <html> <head> & ...
- Docker容器环境下ASP.NET Core Web API应用程序的调试
本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在 ...
- 分享在winform下实现模块化插件编程-优化版
上一篇<分享在winform下实现模块化插件编程>已经实现了模块化编程,但我认为不够完美,存在以下几个问题: 1.IAppContext中的CreatePlugInForm方法只能依据完整 ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- EF 在controller 带参数跳转到新的网址
参考文章:http://blog.csdn.net/zhensoft163/article/details/7174661 我用到了这一种方式: 跳转到同一Controller 里面的不同Action ...
- Servlet数据缓存
缓存是提高数据访问能力,降低服务器压力的一种必要的方式,今天我要说的数据缓存方式有两种,1-->session对单个数据访问接口页面的数据进行缓存,2-->单例模式对整个servlet页面 ...
- Jmeter3.0发布,版本更新都更新了什么
Jmeter已发布了3.0,一个大版本的开源测试工具,加入了一些新的特性及软件的改进. Jmeter已隔10年的大版本更新 这是在过去12年里jmeter第一个大版本的更新,jmeter 2.0版本发 ...
- ios App与网页交互
随着移动APP的快速迭代开发趋势,越来越多的APP中嵌入了html网页,但在一些大中型APP中,尤其是电商类APP,html页面已经不仅仅满足展示功能,这时html要求能与原生语言进行交互.相互传值. ...
- Windows 批处理设置dns ,解决能上qq不能开网页
对于windows 7 @echo off netsh interface ip set dns "本地连接" static 114.114.114.114 primary net ...
- java对xml节点属性的增删改查
学习本文之前请先看我的另一篇文章JAVA对XML节点的操作可以对XML操作有更好的了解. package vastsum; import java.io.File; import java.io.Fi ...