双重OAuth 2.0架构
OAuth 2.0支持几种grant type,由于安全性不同,所以适用范围也不同。背景知识:《理解OAuth 2.0》
| grant type | 是否需要secret | 是否出现授权界面 |
|---|---|---|
| 授权码模式(Authorization Code) | 是 | 是 |
| 隐藏模式(Implicit) | 否 | 是 |
| 密码模式(Password) | 否 | 否 |
| 客户端证书模式(Client credentials) | 是 | 否 |
secret需要保密,而常见的使用场景能否保密呢?如下:
| 使用场景 | 能否保密 |
|---|---|
| web server site | 能 |
| web server api | 能 |
| web app(为避免混乱,下面称为js app) | 不能 |
| mobile app(Android, iOS等) | 不能 |
可以看到app(js,Android, iOS等)无法保密,所以需要无secret的模式才行,也就是隐藏模式(Implicit)或密码模式(Password)。从安全性和可维护性角度考虑,Password模式是让用户直接输入密码,所以只提供给厂商自己app使用。第三方app只有隐藏模式(Implicit)可用,各家服务商的安全警告如下:
- Google : Installed apps are distributed to individual machines, and it is assumed that these apps cannot keep secrets. 原文链接
- Facebook : This app secret should never be included in client-side code or in binaries that could be decompiled. 原文链接
现在来看看常用的账号体系服务商支持的grant type。
| 账号体系 | web支持Authorization Code | web支持Implicit | mobile sdk支持Implicit |
|---|---|---|---|
| 支持 | 支持、js sdk支持 | 支持 | |
| 支持 | js sdk支持 | 支持 | |
| Github | 支持 | 否 | 否,无sdk |
| 支持 | 支持 | 支持 | |
| 微信 | 支持 | 否 | 支持,但文档错误 |
| 微博 | 支持 | 支持,但文档没说,混乱 | 支持,但文档没说,混乱 |
可以看到Github只支持授权码模式,只能在web server上用,不支持app,请谨慎使用。不过由于github是生产力工具,使用github登录的第三方网站也都是生产力工具,比如gitbook.com、travis-ci.org,只在web上用,也是可以理解的。
而微信不支持web Implicit,所以只支持web server,不支持web app,在纯API架构下,会带来混乱。
纯API架构是只开发一套api,同时支持各种app(js、Android、iOS),而没有了web server site。架构如图(https://www.processon.com/view/link/567220ace4b0f79964befccd):
如果再使用OAuth Client即第三方登录,那它的纯API架构如下(https://www.processon.com/view/link/566fe5d1e4b0554d8cfaa6e2):
可以看到大部分公司做API仅供自家app使用,也就是私有API,用这种架构就可以了。多亏了API的HTTP server是自家的,所以也能把授权码模式加进去,用来支持github/微信,架构如下(https://www.processon.com/view/link/56723463e4b0f79964c05229):
而如果API本身需要开放,就没了“自家的API”这个概念了,假设叫做api.example.com,那将变成双重OAuth架构(https://www.processon.com/view/link/5672343ee4b02f55904265bf):
可以想到会有两种场景:
- 第三方app没有自己的HTTP server,比如JS app,无法获取token。如果它们携带自己的app key去github/微信获取用户授权,跳转回JS app的地址获取code,交给api.example.com携带secret去github/微信验证,如果想通过的话,那此app key和secret要对应,即第三方app把自己的secret都告诉api.example.com才行,这样勉强可以用,但安全风险较大……如果第三方app携带example的app key去github/微信获取用户授权,跳转地址不对,无法获得code,此路不通。
- 第三方app有自己的HTTP server,则可以自己换取token,然后发给api.example.com即可。
本文首发地址:http://tomato.life/blog/double-oauth-2
双重OAuth 2.0架构的更多相关文章
- 一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3
今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架--IdentityServer3.其支持完整的OpenID Connect/OAuth 2.0标准, ...
- 构建微服务-使用OAuth 2.0保护API接口
微服务操作模型 基于Spring Cloud和Netflix OSS 构建微服务-Part 1 基于Spring Cloud和Netflix OSS构建微服务,Part 2 在本文中,我们将使用OAu ...
- OAuth 2.0(网转)
(一)背景知识 OAuth 2.0很可能是下一代的"用户验证和授权"标准,目前在国内还没有很靠谱的技术资料.为了弘扬"开放精神",让业内的人更容易理解" ...
- OAuth 2.0中文译本
(一)背景知识 OAuth 2.0很可能是下一代的“用户验证和授权”标准,目前在国内还没有很靠谱的技术资料.为了弘扬“开放精神”,让业内的人更容易理解“开放平台”相关技术,进而长远地促进国内开放平台领 ...
- OAuth 2.0 安全案例回顾
原文:http://drops.wooyun.org/papers/598 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协议(如OpenID)更流行的原因是,业务双方不仅要求账号本身 ...
- OAuth 2.0安全案例回顾
转载自:http://www.360doc.com/content/14/0311/22/834950_359713295.shtml 0x00 背景 纵观账号互通发展史,可以发现OAuth比起其它协 ...
- 微服务安全(二)OAuth 2.0
1. 概念 OAuth是一个开放的.安全的用户认证协议,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源,而无须将用户名和登录口令提供给第三方应用.授权的第三方应用只能在特定的时段内访问特定 ...
- OAuth 2.0 扩展协议之 PKCE
前言 阅读本文前需要了解 OAuth 2.0 授权协议的相关内容, 可以参考我的上一篇文章 OAuth 2.0 的探险之旅. PKCE 全称是 Proof Key for Code Exchange, ...
- 微服务系列之授权认证(一) OAuth 2.0 和 OpenID Connect
1.传统架构的授权认证 传统应用架构,用户使用账号密码登录后,可以使用前端cookie存储登录状态,也可以使用后端session方式存储登录状态,小应用这么做其实很高效实用,当应用需要横向扩展时,就需 ...
随机推荐
- 总结整理 -- ruby系列
基础学习 ruby -- 基础学习(一)项目文件夹说明 ruby -- 基础学习(二) 外键配置实现级联删除 ruby -- 基础学习(三)设置中国时区时间 ruby -- 基础学习(四)TimeDa ...
- 使用ExifInterface设置Datetime发生的问题
最近在弄一个Android小程序,需要把图像的生成时间设置到Exif的Datetime,用ExifInterface.setAttribute(ExifInterface.TAG_DATETIME,& ...
- SharePoint Server 2013开发之旅(三):为SharePoint Server配置App开发、部署、管理环境
上一篇我讲解了如何利用微软提供的Office 365开发人员网站,进行在线的SharePoint App开发,这当然是不错的一个选择,因为你可以快速地进行开发和调试.(仅仅针对App开发而言).但是, ...
- 在office2010的ppt中加入音乐
Microsoft office Powerpoint,是微软公司设计的演示文稿软件.用户不仅可以在投影仪或者计算机上进行演示,也可以将演示文稿打印出来,制作成胶片,以便应用到更广泛的领域中.利用Mi ...
- CentOS 7 关闭防火墙和SELinux
[修改机器名] # vi /etc/hostname [关SELinux] # vi /etc/selinux/config设置SELINUX=disabled [关防火墙] # systemctl ...
- ASP.NET和IIS工作原理
图为iis6.0运行asp.net的原理. browser向iis发送HTTP请求,HTTP.SYS将其分发给W3SVC(World Wide Web Publishing Service),后者解析 ...
- Testing - 测试基础 - 流程
测试存在于各个阶段: 需求测试--->单元测试--->集成测试--->系统测试--->性能测试--->用户测试--->回归测试 需求测试 完整性&正确性 一 ...
- iOS_UIImage_图片剪切
- (UIImage *)imagecutWithRect:(CGRect)rect { CGImageRef subImageRef = CGImageCreateWithImageInRect(s ...
- WPF依赖属性详解
WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...
- Kibana源码剖析 —— savedSearch从读取到跳转
持久化对象 Kibana中可以查询到很多保存的对象,他们都存储在es中一个叫做.kibana的索引中. 搜索 存储在type为search中; 图表 存储在type为visualization中: 仪 ...