OAuth2.0是一套标准.

一、问题

  • 这个标准解决了这样的一个问题. 
    允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 
    第三方应用–比如一个绘图的小软件”paint” 
    用户–比如”我的qq空间账号ws” 
    私密信息–比如我qq空间中的照片 
    资源服务方-qq空间 
    认证服务器-qq空间

  • 正常情况下,要访问用户ws的qq中的照片, 需要将账号和密码发送到qq空间的认证服务器验证身份. 
    但是第三方应用要访问, 怎么办呢? 
    把账号密码告诉第三方应用paint,肯定不行 
    这就相当于把密码告诉别人,而且还是我不认识的人.不安全. 
    paint只需要一个照片,但把密码都给他了,他连我的日记都能看了. 
    paint如果把密码公开或者泄露给别人的,那我怎么办.

二、解决

  • OAuth2.0是怎么解决的呢? 
    给第三方应用paint一个临时密码,过期作废,而且这个密码的访问权限可由我随时取消.这样就足够安全了. 
    这个临时密码就是access_token. 
    当然发放access_token的方法就多种多样了,这些方法叫做授权模式

  • 授权模式一共四种: 
    1.客户端模式(Client Credentials) 
    2.密码模式(User Credentials) 
    3.简化模式(Implicit) 
    4.授权码模式(Authorization Code)

三、授权模式

1.客户端模式(Client Credentials)

这是最简单的一种方式, 不需要得到用户ws授权,只要资源服务方qq空间对第三方应用paint发放一个client_id和client_secret, 第三方应用访问资源时通过刚才的id和secret进行验证后即返回access_token. 
当然,这样对用户ws有些不公平,但实际上,在第三方应用paint所访问的资源与用户ws关系不大时就比较方便了. 
此时,paint能从qq空间获取任意图片,只需要向qq空间认证,因为这些图片与具体某个用户无关.

2.密码模式(User Credentials)

用户ws将自己的用户名密码直接告知第三方应用paint, paint即可使用这个密码向资源服务方qq空间获取图片. 
这个方法就是刚才说过的很不安全的方法.但仍然有其适用的范围. 
就是在用户ws与第三方应用paint更相熟情况, 也就是ws完全信任paint,放心的把密码交给paint使用. 
此时,paint仅能获取用户ws的图片, 不能获取ws2,ws3等用户的图片,所以paint一定要取得ws的信任拿到密码.

3.简化模式(Implicit)

paint要得到access_token并且,不必知道ws的具体密码. 
paint会访问qq空间某一api接口时,告知client_id, user_id, redirect_url,qq空间收到请求后将页面跳转到认证页面, 
然后浏览器跳转至qq空间的认证页面,用户ws在此页面输入用户名密码,在qq空间认证成功后. 
qq空间将浏览器跳转到paint提前指定的redirect_url上,传入access_token. 这时paint即可得到access_token.

注: 
这里的access_token如何能被paint得到? 就是解析redirect_url的参数. 
比如这样 ,直接取url参数得到access_token为abcdefg. 
http://my.redirect_url.com?access_token=abcedfg

在一些移动应用的程序内部实现时,即使redirect_url是一个错误的地址,也能解析到access_token. 
因为应用内部会收到302跳转的数据,只要从中解析到token后,不执行跳转动作即可. 
这个问题,困惑了我好久.经过朋友帮助才终于理解.

4.授权码模式(Authorization Code)

授权码模式与简化模式的过程是一样的. 
不同之处在于,qq空间跳转到paint的redirect_url时,不直接返回access_token,而是返回一个code. 
paint需要再将code发到qq空间,请求对应的access_token. 
为什么要多此一举? 
简化模式适用于paint是移动客户端应用的情况, 这个应用请求access_token后, 可直接获取到access_token.并且这个access_token是在url参数后的. 
也就是如果客户端能显示出网址,用户就能看见access_token. 此时access_token是相对公开的不安全. 
而授权码模式适用于paint是移动客户端应用,而且拥有自己的公网服务器, 那么它可以在请求到access_token时, 首先是公网服务器(通过redirect_url)得到code, 
由公网服务器使用code请求access_token. 这时paint的公网服务器直接向qq空间请求照片,然后再将照片转发到paint移动客户端应用. 
整个过程客户端是没有得到access_token的.相对来说更安全.

授权码模式时序图(引用自腾讯) 
(user: 用户ws App:第三方应用paint Auth_svr:认证服务器,qq空间)


四、总结

上面就是自己的浅见,本人实践过程仅搭建了一个简单的OAuth2.0服务器,用于其他合作伙伴访问我们的api时进行权限认证. 
是一个比较简单的应用. 
在学习理解OAuth2.0过程,参考了阮老师的文章.他的语言文字描述更准确透彻,且容易理解. 可以点击此处查看. 
另外,OAuth2.0官网上的教程一步一步搭建OAuth2.0服务器对我帮助也很大. 
官网有好几种实现方式,都是开源贡献者的精华,我只详细看了php的实现,就已经深深佩服. 
一个看似简单的功能,竟然能实现的非常灵活, 仅需要很少的改动就能完整实现上述的4种认证授权模式,并且还有本文没有提到,但是标准中定义的很多其他细节.

五、参考资料:

0. 如何选择OAuth2.0各种授权类型

https://github.com/thephpleague/OAuth2-server/wiki/Which-OAuth-2.0-grant-should-I-use%3F

1.OAuth1.0 OAuth2.0的实现原因及安全性问题, 是PPT内容。

张天琪——oauth security.pdf 

2.关于OAuth2.0的规范详细理解。

理解OAuth 2.0 作者: 阮一峰 
http://www.ruanyifeng.com/blog/2014/05/OAuth_2_0.html

3.其他网站使用OAuth2.0授权认证的接口文档

关于OAuth2.0的详细介绍,请参考OAuth2.0协议标准。 
腾讯 (这个有时序图,讲的比较清晰。当然要配合”理解OAuth 2.0”一起理解) 
http://wiki.open.t.qq.com/index.php/OAuth2.0%E9%89%B4%E6%9D%83#.E8.8E.B7.E5.8F.96accesstoken.E7.9A.84.E4.B8.A4.E7.A7.8D.E6.96.B9.E5.BC.8F
人人网 
http://wiki.dev.renren.com/wiki/Authentication 
来往 
http://open.laiwang.com/docs/authentication.html 
微信认证的接口使用方法. 
http://mp.weixin.qq.com/wiki/index.php?title=%E8%8E%B7%E5%8F%96access_token

4.帮你深入理解OAuth2.0协议

http://blog.csdn.net/seccloud/article/details/8192707 
OAuth协议实例化描述 
下面我以实例化方式来帮助读者理解授权码类型的授权协议的运行过程。假设: 
(1) Alice有一个有效的Google帐号; 
(2) Facebook.com已经在Google Authorization Server上注册了Client身份,已经获得(client_id, client_secret),注意client_secret是Client与AS之间的一个共享密钥。 
(3) Alice想授权Facebook.com查看她的联系人列表(https://www.google.com/m8/feeds)。 
图3展示了Alice、Facebook.com、Google资源服务器、以及Google OAuth授权服务器之间的协议运行过程。

 
 

OAuth2.0 用户验证授权标准 理解的更多相关文章

  1. OAuth2.0认证和授权以及单点登录

    https://www.cnblogs.com/shizhiyi/p/7754721.html OAuth2.0认证和授权机制讲解 2017-10-30 15:33 by shizhiyi, 2273 ...

  2. OAuth2.0 四种授权模式

    OAuth2.0简单笔记(四种授权模式) 金天:坚持写东西,不是一件容易的事,换句话说其实坚持本身都不是一件容易的事.如果学习有捷径,那就是不断实践,不断积累.写笔记,其实是给自己看的,是体现积累的一 ...

  3. OAuth2.0和SSO授权的区别

    OAuth2.0和SSO授权   一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...

  4. 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

    在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client   阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...

  5. 理解OAuth2.0协议和授权机制

    无论是自然资源还是互联网上的资源,需要控制使用权与被使用权,以保护资源的安全.合理的使用和有效的管控. 项目中,我们需要控制的是用户资源,既要保证有效用户的合理使用,又要防范非法用户的攻击.如此,如何 ...

  6. OAuth2.0认证和授权原理

    什么是OAuth授权?   一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密 ...

  7. [转载] OAuth2.0认证和授权原理

    转载自http://www.tuicool.com/articles/qqeuE3 什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准,允许第三方网站在用户授权的前 ...

  8. OAuth2.0认证和授权机制讲解

    第一章.OAuth2.0 介绍 OAuth认证 OAuth认证是为了做到第三方应用在未获取到用户敏感信息(如:账号密码.用户PIN等)的情况下,能让用户授权予他来访问开放平台(主要访问平台中的资源服务 ...

  9. OAuth2.0和SSO授权

    一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该访问令牌访问资源服务器的资源.由于 ...

随机推荐

  1. OCCI结果集(ResultSet)性能优化

    对于ResultSet类中的next()方法,默认是一次检索一行数据,及一次检索执行一次网络往返,当结果集数量大时,效率低:对此OCCI提供了几种改善方法,即:在一次网络往返返回多行数据. 1. 通过 ...

  2. Spring框架基础2

    Spring框架基础2 测试Spring的AOP思想和注解的使用 导包(在前面的基础上添加) SpringAOP名词解释 AOP编程思想:横向重复代码,纵向抽取:就是说多个地方重复的代码可以抽取出来公 ...

  3. Spring Cloud 入门Eureka -Consumer服务消费(声明式Feign)(三)

    Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端.它使得编写Web服务客户端变得更加简单.我们只需要通过创建接口并用注解来配置它既可完成对Web服务接 ...

  4. Centos下使用Docker部署asp.net core项目

    本文讲述 CentOS 系统 Docker 中部署 asp.net core开源项目 abp 的过程 步骤 1. 拉取 asp.net core 基础镜像 docker pull microsoft/ ...

  5. centOS初了解--***安装node

    在***买了一个VPS,用了差不多一年了,除了做FQ使用之外,同时也下载了一个node,用了express搭建了一个服务,同时我在博客园有博客,我也懒得转来转去了,直接做了一个重定向,跳转到了博客园. ...

  6. IE6兼容png图片

    <!--[if IE 6]> <script src="/js/DD_belatedPNG.js"></script> <script&g ...

  7. centos7重启apache、nginx、mysql、php-fpm命令

    apache启动systemctl start httpd停止systemctl stop httpd重启systemctl restart httpd mysql启动systemctl start ...

  8. linuxC编程介绍

    第一步:写完程序 /first.c/ #include <stdio.h> int main() { printf("hello,welcome to the LinuxC!\n ...

  9. linux学习(1)——这是一个新的开始,加油吧少年

     (一)自己简单总结 学会使用简单命令 Tab:实现自动补全功能 Ctrl+D:退出当前终端 Ctrl+Z:暂停当前进程 Ctrl+L:清屏 Ctrl+A:可以让光标移动到最前列 Ctrl+E:可以让 ...

  10. 005--Django2.0的路由层

    URL配置就像Django所支撑的网站目录,它的本质是每条URL调用的视图函数的映射表,每一个请求执行对应的视图函数. 1.简单的路由配置  from django.contrib import ad ...