常识二Oauth2.0介绍及安全防范

简介: oAuth是Open Authorization的简写OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

Oauth概念

oAuth是Open Authorization的简写

OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。

OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。

OAuth2.0

OAuth 2.0是一个应用之间彼此访问数据的开源授权协议。比如,一个游戏应用可以访问Facebook的用户数据

image.png

授权流程

image.png

第一步,用户访问客户端web应用。应用中的按钮”通过Facebook登录”(或者其他的系统,如Google或Twitter)。

第二步,当用户点击了按钮后,会被重定向到授权的应用(如Facebook)。用户登录并确认授权应用中的数据给客户端应用。

第三步,授权应用将用户重定向到客户端应用提供的URI,提供这种重定向的URI通常是通过注册客户端应用程序与授权应用程序完成。在注册中,客户端应用的拥有者组注册该重定向URI,在注册过程中认证应用也会给客户端应用客户端标识和密码。在URI后追加一个认证码。该认证码代表了授权。

第四步,用户在客户端应用访问网页被定位到重定向的URI。在背后客户端应用连接授权应用,并且发送在重定向请求参数中接收到的客户端标识,客户端密码和认证码。授权应用将返回一个访问口令。

一旦客户端有了访问口令,该口令便可以被发送到Facebook、Google、Twitter等来访问登录用户的资源。

角色定义

image.png

  1. Third-party application:第三方应用程序,本文中又称"客户端"(client)
  2. Resource Owner:资源所有者,本文中又称"用户"(user)。
  3. User Agent:用户代理,本文中就是指浏览器。
  4. Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
  5. Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

客户端的授权模式

客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。

image.png

OAuth 2.0定义了四种授权方式。

  • 授权码模式(authorization code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials)
  • 客户端模式(client credentials)

授权码模式(authorization code)

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。

image.png

(A)用户访问客户端,后者将前者导向认证服务器。

(B)用户选择是否给予客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。

(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

A:客户端申请认证的URI 包含以下参数:

response_type:表示授权类型,必选项,此处的值固定为"code"

client_id:表示客户端的ID,必选项

redirect_uri:表示重定向URI,可选项

scope:表示申请的权限范围,可选项

state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值

GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1Host: server.example.com

C:服务器回应客户端的URI

包含以下参数:

code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。

state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

D: 客户端向认证服务器申请令牌的HTTP请求

包含以下参数:

grant_type:表示使用的授权模式,必选项,此处的值固定为"authorization_code"。

code:表示上一步获得的授权码,必选项。

redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。

client_id:表示客户端ID,必选项。

client_secret:在开放平台申请时提供的APP Secret

POST /token HTTP/1.1Host: server.example.comAuthorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JWContent-Type: application/x-www-form-urlencodedgrant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

E:认证服务器发送的HTTP回复

包含以下参数:

access_token:表示访问令牌,必选项。

token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。

expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。

refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。

scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

最后根据access_token,使用它,就可以去获取用户的资源了,要获取用户昵称和头像

授权示例

(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)。

展示了Alice、Facebook.com、Google资源服务器、以及Google OAuth授权服务器之间的协议运行过程。

image.png

简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

image.png

(A)客户端将用户导向认证服务器。

(B)用户决定是否给于客户端授权。

(C)假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。

(D)浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。

(E)资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。

(F)浏览器执行上一步获得的脚本,提取出令牌。

(G)浏览器将令牌发给客户端。

密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。

客户端使用这些信息,向"服务商提供商"索要授权。

在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。

这通常用在用户对客户端高度信任的情况下,比如客户端是操作系统的一部分,或者由一个著名公司出品。

而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。

image.png

(A)用户向客户端提供用户名和密码。

(B)客户端将用户名和密码发给认证服务器,向后者请求令牌。

(C)认证服务器确认无误后,向客户端提供访问令牌。

B步骤中,客户端发出的HTTP请求,

包含以下参数:

grant_type:表示授权类型,此处的值固定为"password",必选项。

username:表示用户名,必选项。

password:表示用户的密码,必选项。

scope:表示权限范围,可选项。

POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded     grant_type=password&username=johndoe&password=A3ddj3w

C步骤中,认证服务器向客户端发送访问令牌,

下面是一个例子。

HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

整个过程中,客户端不得保存用户的密码。

客户端

客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。

严格地说,客户端模式并不属于OAuth框架所要解决的问题。

在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

image.png

(A)客户端向认证服务器进行身份认证,并要求一个访问令牌。

(B)认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,

包含以下参数:

granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。

scope:表示权限范围,可选项。

POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded     grant_type=client_credentials

认证服务器必须以某种方式,验证客户端身份。 B步骤中,认证服务器向客户端发送访问令牌,下面是一个例子。

HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "example_parameter":"example_value"
     }

OAuth2.0安全

CSRF

CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。

CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型的BLOG网站),YouTube和百度HI......而现在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。

本质 攻击者盗用了你的身份,以你的名义发送恶意请求

攻击流程

假设有用户张三,和攻击者李四,还有一个第三方Web应用Tonr,它集成了第三方社交账号登录,并且允许用户将社交账号和Tonr中的账号进行绑定。此外还有一个OAuth2服务提供者Sparklr。

image.png

Step 1. 攻击者李四登录Tonr网站,并且选择绑定自己的Sparklr账号。

Step 2. Tonr网站将李四重定向到Sparklr,由于他之前已经登录过Sparklr,所以Sparklr直接向他显示“是否授权Tonr访问”的页面。

Step 3. 李四在点击”同意授权“之后,截获Sparklr服务器返回的含有Authorization Code参数的HTTP响应。

Step 4. 李四精心构造一个Web页面,它会触发Tonr网站向Sparklr发起令牌申请的请求,而这个请求中的Authorization Code参数正是上一步截获到的code。

Step 5. 李四将这个Web页面放到互联网上,等待或者诱骗受害者张三来访问。

Step 6. 张三之前登录了Tonr网站,只是没有把自己的账号和其他社交账号绑定起来。在张三访问了李四准备的这个Web页面后,令牌申请流程在张三的浏览器里被顺利触发,Tonr网站从Sparklr那里获取到access_token,但是这个token以及通过它进一步获取到的用户信息却都是攻击者李四的。

Step 7. Tonr网站将李四的Sparklr账号同张三的Tonr账号关联绑定起来,从此以后,李四就可以用自己的Sparklr账号通过OAuth登录到张三在Tonr网站中的账号,堂而皇之的冒充张三的身份执行各种操作。

image.png

对于开发者而言,要修复这个漏洞,就是必须加入state参数,这个参数既不可预测,又必须可以充分证明client和当前第三方网站的登录认证状态存在关联(如果存在过期时间更好)。其实,随机算一个字符串,然后保存在session,回调时检查state参数和session里面的值,就满足要求了。

参考资料

http://insights.thoughtworkers.org/attack-aim-at-oauth2/#utm_source=rss&utm_medium=rss

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

目录
相关文章
|
4月前
|
机器学习/深度学习 人工智能 安全
网络安全与信息安全:漏洞、加密和意识的三重防线
【7月更文挑战第31天】在数字化时代的浪潮中,网络安全与信息安全的重要性日益凸显。本文将深入探讨网络环境中的安全威胁,特别是安全漏洞的存在及其被利用的方式。文章还将介绍当前加密技术的进展,以及如何通过提升安全意识和实施有效的管理策略来强化个人和组织的数据保护。通过分析最新的案例研究和统计数据,本文旨在为读者提供一个全面的网络安全知识框架,帮助他们在防范网络攻击和数据泄露方面采取更加主动和有效的措施。
|
3天前
|
SQL 安全 算法
网络安全的守护神:漏洞、加密与意识
在数字时代的浪潮中,网络安全已成为个人隐私和组织资产保护的关键。本文将探讨网络安全的三大支柱:网络漏洞的识别与防范、数据加密技术的应用以及提升公众的安全意识。通过这些维度,我们旨在为读者提供一个关于如何构建更安全网络环境的全面指南。
12 4
|
3天前
|
存储 安全 算法
网络防御的前线:漏洞、加密与安全意识的交织
在数字世界的海洋中,网络安全是守护我们信息资产的灯塔。本文将深入探讨网络安全的核心要素:漏洞识别与管理、加密技术的应用,以及提升个人和组织的安全意识。我们将通过具体案例分析,揭示这些要素如何相互作用,共同构建起坚固的防线。
11 3
|
1月前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密与意识的三重奏
【8月更文挑战第65天】在数字世界的交响乐中,网络安全和信息安全是不可或缺的乐章。本文将带领读者走进这些乐章的背后,探索它们如何共同奏响保护我们数据安全的和谐旋律。从网络安全漏洞的隐秘角落到加密技术的坚固堡垒,再到安全意识的灯塔,我们将一同航行在这个复杂而精彩的信息安全海洋中。准备好了吗?让我们启航!
|
2月前
|
SQL 安全 网络安全
网络安全的盾牌:漏洞防御与信息加密技术
【9月更文挑战第27天】在数字时代,网络安全和信息安全成为维护数据完整性、保密性和可用性的关键因素。本文将探讨网络安全漏洞的概念、成因及预防措施,同时深入讨论加密技术在保护信息安全中的作用。通过分析安全意识的重要性和提升方法,旨在为读者提供一套全面的网络安全知识框架,以增强个人和组织对抗网络威胁的能力。
39 5
|
1月前
|
机器学习/深度学习 人工智能 监控
数据泄露时代的安全之道:访问认证的重要性
访问认证不仅是企业保护数据安全的重要工具,也是企业实现合规管理和提升工作效率的关键手段。通过合理的权限管理和定期的审查,企业可以有效防范数据泄露的风险,保障自身和客户的利益。在这个数字化时代,数据安全已经成为企业生存和发展的重要保障。希望所有企业都能认识到访问认证的重要性,积极采取措施,构建强大的数据安全防护体系。
|
2月前
|
SQL 安全 算法
网络安全的盾牌:漏洞、加密与意识
【9月更文挑战第8天】在数字时代的浪潮中,网络安全成为保护信息资产的坚固盾牌。本文将深入探讨网络安全的三大核心要素:网络漏洞、加密技术以及安全意识。我们将通过实际案例分析常见的网络攻击手段,揭示漏洞产生的原因及其危害;介绍当前主流的加密技术,并通过代码示例展示其工作原理;最后强调提升个人和组织的安全意识对于防范网络威胁的重要性。文章旨在为读者提供全面的网络安全知识,帮助构建更为坚固的信息安全防线。
|
3月前
|
安全 网络安全 数据安全/隐私保护
网络安全的守护神:漏洞、加密与意识的三重奏
【8月更文挑战第25天】 在数字世界的交响乐中,网络安全扮演着不可或缺的角色。本文将带领读者走进网络安全的核心乐章,从网络漏洞的警钟,到加密技术的保护符,再到安全意识的盔甲,我们将一探究竟。文章旨在通过浅显的语言,揭示网络安全的复杂性与重要性,同时提供实用的知识和建议,让每个人都能成为自己信息安全的守护者。
53 6
|
3月前
|
SQL 安全 算法
网络安全与信息安全:漏洞、加密与意识的博弈
【8月更文挑战第31天】在数字化时代的浪潮中,网络安全与信息安全成为维护个人隐私和企业资产的关键防线。本文旨在揭示网络空间的潜在威胁,探讨防御策略,并强调安全意识的重要性。我们将从网络安全的基本概念出发,深入分析常见漏洞类型及其成因,介绍加密技术的原理和应用,并通过代码示例展示如何实践安全编程。最后,我们将讨论如何通过教育和培训提高个人和组织的安全意识,以应对不断演变的网络威胁。
|
4月前
|
SQL 安全 算法
网络安全与信息安全:漏洞、加密与防范意识的深度剖析
【7月更文挑战第27天】在数字时代的浪潮中,网络安全和信息安全成为维护社会稳定与个人隐私的重要支柱。本文将深入探讨网络环境中的安全漏洞、先进的加密技术以及提升公众安全意识的必要性,旨在为读者提供一套综合性的网络安全知识体系。通过分析常见的网络攻击手段和防御策略,文章揭示了在日益复杂的网络威胁面前,如何构建一个更加安全的网络环境。