OAuth2.0 协议的理解
OAuth(Open Authorization)协议就是为用户资源的授权提供了一个安全、开放、简易的标准。
OAuth在第三方应用与服务提供商之间设置了一个授权层,第三方应用通过授权层获取令牌,再通过令牌获取信息。
一、OAuth中的一些名词
Client 第三方应用程序,又称客户端。
Resource Owner 资源所有者。
Http service 提供http服务的服务提供商。
Authorization server 认证服务器,服务提供商专门用来处理认证的服务器。
Resource server 资源服务器,服务提供商专门用来提供用户资源的服务器。
二、OAuth协议流程
- +--------+ +-------------+
- | |--- (1) Authorization Request -->| Resource |
- | |<-- (2) Authorization Grant ---| Owner |
- | | +-------------+
- | |
- | | +-------------+
- | Client |--- (3) Authorization Grant -->|Authorization|
- | |<-- (4) Access Token ---| Server |
- | | +-------------+
- | |
- | | +-------------+
- | |--- (5) Access Token -->| Resource |
- | |<-- (6) Protected Resource ---| Server |
- +--------+ +-------------+
1、第三方应用请求用户给予授权。
2、用户同意给予第三方应用授权。
3、第三方应用使用上一步获取的授权,向认证服务器申请令牌。
4、认证服务器对第三方应用进行认证,准确无误后,发放令牌。
5、第三方应用使用令牌,向资源服务器获取资源。
6、资源服务器确认令牌无误后,向第三方应用开放资源。
不难看出,第二步是最关键的,第三方应用获取了授权,就可以通过授权获取令牌,进而通过令牌获取资源。
三、OAuth的四种授权模式
1、授权码模式
功能最完整、流程最严密的授权模式。
特点就是通过第三方应用的后台服务器,与服务提供商的认证服务器进行互动。
流程如下:
(1)、用户使用第三方应用,第三方应用将用户跳转到认证服务器。
(2)、用户选择是否给第三方应用授权。
(3)、如果用户给予授权,则认证服务器将用户跳转至事先指定的重定向URI(redirect_uri),同时在URL附加上一个授权码(code)。
(4)、第三方应用获取授权码(code),附加上重定向URI(redirect_uri),向认证服务器申请令牌。这一步是在第三方应用服务器后台完成的,用户不可见。
(5)、认证服务器确认授权码(code)和重定向URI(redirect_uri)无误后,向第三方应用发送令牌(access_token)和更新令牌(refresh_token)。
2、简化模式
不通过第三方应用的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。
所有步骤在浏览器中完成,令牌对访问者是可见的,且第三方应用不需要认证。
流程如下:
(1)、用户使用第三方应用,第三方应用将用户跳转到认证服务器。
(2)、用户选择是否给第三方应用授权。
(3)、如果用户给予授权,认证服务器将用户跳转至事先指定的重定向URI(redirect_uri),在URI的hash部分包含了访问令牌。
(4)、浏览器向资源服务器发出请求,想要提取URI中的令牌(access_token)。
(5)、资源服务器返回带有解析脚本的页面,用于解析重定向URI中的令牌(access_token)。
(6)、浏览器使用解析脚本,获取令牌。
(7)、浏览器将令牌发送给第三方应用。
3、密码模式
用户向第三方应用提供自己的用户名和密码。第三方应用使用这些信息,向服务商提供商索要授权。
在这种模式中,用户必须把自己的密码给第三方应用,但是第三方应用不得储存密码。
这通常用在用户对第三方应用高度信任的情况下,比如第三方应用是操作系统的一部分,或者由一个著名公司出品。
而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
流程如下:
(1)、用户将用户名和密码提供给第三方应用。
(2)、第三方应用将用户名和密码发送给认证服务器,申请令牌。
(3)、认证服务器确认无误后,向第三方应用提供令牌。
4、客户端模式
指第三方应用以自己的名义,而不是以用户的名义,向服务提供商进行认证。
严格地说,客户端模式并不属于OAuth框架所要解决的问题。
在这种模式中,用户直接向第三方应用注册,第三方应用以自己的名义要求服务提供商提供服务,其实不存在授权问题。
流程如下:
(1)、第三方应用向认证服务器申请令牌。
(2)、认证服务器确认无误后,向第三方应用提供令牌。
四、以接入QQ第三方登陆为例
1、首先我们需要到https://connect.qq.com/创建一个开发者账号,审核通过后,获取到appid和appkey。
2、在网站上放置QQ登录按钮。
3、当用户点击QQ登录按钮,则会跳转至QQ的授权地址。
- https://graph.qq.com/oauth2.0/authorize?response_type=code&state=&client_id=&redirect_uri=
4、用户给予授权后,页面将跳转至上一步redirect_uri设置的地址,并附加上授权码(code)。
5、通过授权码,向认证服务器申请令牌(access_token)。
- https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=&client_secret=&code=&redirect_uri=
6、通过令牌,我们就可以拿到用户的openid。
- https://graph.qq.com/oauth2.0/me?access_token=
7、通过appid,openid和令牌,我们就可以获取用户信息了。
- https://graph.qq.com/user/get_user_info?access_token=&oauth_consumer_key=&openid=
OAuth2.0 协议的理解的更多相关文章
- 对OAuth2.0协议的理解和测试demo
1. 什么是OAuth OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容. OAuth ...
- 理解OAuth2.0协议和授权机制
无论是自然资源还是互联网上的资源,需要控制使用权与被使用权,以保护资源的安全.合理的使用和有效的管控. 项目中,我们需要控制的是用户资源,既要保证有效用户的合理使用,又要防范非法用户的攻击.如此,如何 ...
- Spring Security 实战干货: 简单的认识 OAuth2.0 协议
1.前言 欢迎阅读 Spring Security 实战干货 系列文章 .OAuth2.0 是近几年比较流行的授权机制,对于普通用户来说可能每天你都在用它,我们经常使用的第三方登录大都基于 OAuth ...
- 第三方登录,一般都是遵循OAuth2.0协议。
1. QQ登录OAuth2.0协议开发流程 1.1 开发流程 申请接入,获取appid和appkey; 开发应用,设置协作者账号,上线之前只有协作者才能进行第三方登录 放置QQ登录按钮(这个自己可以用 ...
- 接口测试工具-Jmeter使用笔记(八:模拟OAuth2.0协议简化模式的请求)
背景 博主的主要工作是测试API,目前已经用Jmeter+Jenkins实现了项目中的接口自动化测试流程.但是马上要接手的项目,API应用的是OAuth2.0协议授权,并且采用的是简化模式(impli ...
- 使用OAuth2.0协议的github、QQ、weibo第三方登录接入总结
目录 第三方接入总结 OAuth2.0介绍 github OAuth2.0登录接入 国内第三方应用商SDK使用 微博SDK 腾讯QQ SDK passport.js插件使用 安装 相关中间件.路由 返 ...
- Oauth2.0协议曝漏洞 大量社交网站隐私或遭泄露
2014年是IT业界不平常的一年,XP停服.IE长老漏洞(秘狐)等等层出不穷,现在,社交网络也爆出惊天漏洞:Oauth2.0协议漏洞 继OpenSSL漏洞后,开源安全软件再曝安全漏洞.新加坡南洋理工大 ...
- 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议
概述说明 CAS Server默认搭建出来,客户端程序只能按照CAS自身的协议接入.CAS的强大在于,有官方的插件,可以支持其他的协议.本章节就让CAS Server怎么增加OAuth2.0的登录协议 ...
- 《OAuth2.0协议安全形式化分析-》----论文摘抄整理
---恢复内容开始--- 本篇论文发表在计算机工程与设计,感觉写的还是很有水准的.实验部分交代的比较清楚 本篇论文的创新点: 使用Scyther工具 主要是在 DY模型下面 形式化分析了 OAuth2 ...
随机推荐
- css修改整个项目的滚动条样式
在项目中,滚动条不可避免的药出现.设置统一规范的滚动条也是必然.用一个独立的css文件即可修改整个项目中的滚动条样式 . scrollBar.css: /* 滚动条有滑块的轨道部分 */ ::-web ...
- layer.open参数;layer.open关闭事件;layer.open关闭刷新;layer.open获取子页的值;layer.open调用子页面的方法
父页面 function layerOpen() { layer.open({ type: 2, shade: [0], title: "验收申请", area: ['1024px ...
- 【python】django上传文件
参考:https://blog.csdn.net/zahuopuboss/article/details/54891917 参考:https://blog.csdn.net/zzg_550413470 ...
- zuul ci
. ├── a_module ├── b_module ├── lib ├── zuul │ ├── check │ ├── ci │ ├── gate │ ├── layout.ya ...
- 【HP-UNIX】修改HP-UNIX主机名称
原文链接:https://blog.csdn.net/lantianbaiyunbj/article/details/53434537 HP-UX修改主机IP地址 方法一 1.set_parms ho ...
- 记录一次JQuery 动态参数使用
之前动态id 使用时时候一直是复制黏贴的,到自己实际使用的时候却毫无印象,这样不可取呀 $('#id') 取的是 id=‘id’ 的元素 $('#'+id) 才是取id为动态值的时候正确写法 记录 ...
- java面试题复习(三)
21.静态嵌套类和内部类的不同? 答:静态嵌套类是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化.而通常的内部类需要在外部类实例化后才能实例化.//还是考的static的知识 ...
- python目录结构
import sys,os #__file__取得当前文件名,pycharm会自动加上完整路径 #os.path.dirname取得上一级目录 #os.path.abspath取得绝对路径 BASE_ ...
- azkaban使用--指定executor
PS:局限,虽然可以指定在一台节点上执行,但是失去了高可用的优势,如果有不同类型的任务建议用多套azkaban 假如二台executor,下图中的4,5,我想将任务运行在hadoop02上,因为只有这 ...
- Xilinx Zynq ZC-702 开发(02)—— 软件程序调试方法
1.简介 本教程将指导您使用 SDK 调试应用程序项目,本教程中描述的调试步骤是非常基础的:有关更多信息,请参考 SDK 帮助中的调试任务. 在使用本教程之前,您应该已经创建了一个应用程序项目,并在工 ...