Oauth2.0如何理解?

76 篇文章 16 订阅
72 篇文章 3 订阅

1、 Oauth2.0 解决了一个什么样的问题?

在此之前,我们在登陆每个应用时,采用账户和密码的模式。大家六亲不认,只认密码。同样,用户的应用与应用之间,也往往是这样的,如果应用A你要访问我应用B,那你必须要有客户在我应用B中的账户和密码。

这个优点是,简单,粗暴。缺点是,应用B的客户隐私都泄露了,谁都担心;另外,互相要记这么多账户和密码,特别是密码,谁受得了。特别是老同志。

有没有一个通用的应用(类似于QQ,微信,github),可以用来登陆其它的应用(比如csdn,知乎,163邮箱等)?

Oauth2.0就是解决这个问题的。

2、模式与区别

我们以QQ账户登陆csdn来举例:

在Oauth2.0模式下,【授权方和资源方】

QQ应用账户(授权方)去登陆csdn(第三方),此时是csdn访问QQ应用【QQ是资源方,不要搞反了】,访问QQ的用户的信息,以及其它授权的信息范围;在原来的模式下,需要QQ应用的账户和密码来验证;此时QQ不需要给密码,而是发token,这样,csdn可以用QQ方发的token也可以访问QQ.

相当于,你去银行取钱,你出示国家发的身份证,就可以;

而原来的模式是,csdn请你登陆者出示你在csdn注册的账户和密码,其它的什么身不身份证的,不管。

具体的模式是:

在这里插入图片描述
在上面,用几个角色:

比如资源所有方(resource owner):用户
第三方应用:client Application ;在这里指的是csdn
资源服务器:resource server ; 指的是QQ
认证服务器:authorization server

在现实中,资源服务器与认证服务器往往为一体。比如QQ 。账户服务器(也就是资源服务器)和认证服务器往往就都由QQ方安排。

容易混同:

需要注明的是:当QQ去登陆CSDN时,是CSDN去访问和索要(get\post\put等)QQ的数据和信息,不是QQ去访问CSDN的信息。这个和直觉好象不符。这主要与展示产生的错觉有关。

总结一下:

授权服务器看到用户的授权发code;
授权服务器经验证程序后发token;
资源服务器负责给持有token的访问者,访问它的账户信息,以及其它授权信息(scope);

3、Oauth2.0是如何工作?

Oauth2.0有四种模式,本文以授权码模式来介绍。

上一张图:【这个模式相对简化】

在这里插入图片描述资料来源:https://zhuanlan.zhihu.com/p/46573571

从QQ账户登陆doubian的过程,比较清楚地介绍了这么几个流程:

用户登陆QQ->
QQ认证中心发出授权码code->
用户把获得的code给doubian ->
doubian把code给QQ认证中心->
QQ认证中心把token给doubian ->
doubian 带着token就可以访问QQ了【用户信息及其它信息】

4、为什么要有code呢?

code本身就临时的,比如,很多应用设置10分钟过期。即使code被人抢走,后用login时还是会产生code,会把前面的产生的token覆盖。

5、需要什么验证程序才发token?–签名验证算法

这个涉及到移动应用开发中AppID、AppKey、AppSecret。
具体参见:https://www.cn-shenliang.com/newsinfo/360153.html

在这里插入图片描述

其中, AppID:应用的唯一标识,“应用的身份证” 【这个我认为应是QQ认证这个应用的唯一编号,应是QQ方发的,待确认】
AppKey:公匙(相当于账号)【这个是应是开发人员通过算法生成的,也可以通过特定平台比如微信、QQ等平台的工具生成,这个是给QQ方解签用的】
AppSecret:私匙(相当于密码,与AppKey是一对的,类似RSA的一对key)【这个是开发人员签名用的,不能暴露给其它人】

我理解: doubian
用AppSecret即私匙对相关的信息(或其摘要)进行签名,同时发布Appkey公匙,让QQ 资源服务器去解签,如果成功,证明的确是由doubian发来。解签后,才发出token.
这里用到了签名的算法。

6、为什么Oauth2.0能起到安全认证的作用?

待补充

7、https起到什么作用?

防止token以明文的方式 传输。正常的话,认证中心的token会以加密的方式。此时,支持https就是必要的。
如果全部以https传输的话,理论上code也可以不用(待确认)?

8、为什么需要url重定向?
因为h5或页面的跳转,不会自动生成,比如

当用户点击按钮同意授权后,授权服务器将生成一个用户凭证(code),此时授权服务器如何将用户凭证(code)传递给第三方应用呢?此时,就需要有重定向机制,即跳转环节。

9、token有效期多长?

正常情况下有access_token,expire_date,refresh_token三个字段。如果到期了,access_token就会失效,需要重新更新。
比如,我们在QQ上一个应用时,过了一段时间,就会要我们重新登陆。这个机制就被用上了。

参考资料:
1、http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
2、https://www.chrisyue.com/security-issue-about-oauth-2-0-you-should-know.html
3、https://zhuanlan.zhihu.com/p/46573571
4、https://zhuanlan.zhihu.com/p/20913727

其中,参考文献3的流程总结如下:

第1步. 用户授权用户身份确认后会进入下面这个页面,该页面由授权服务器提供,授权服务器会告诉用户该第三方在授权服务器中提交的相关信息(如果需要实现第三方登录功能,第三方应用需要向Github、微博等应用中提交应用的相关信息,不同服务可能会需要审核等不同的步骤),以及授权后第三方应用能够获取哪些资源。在Github中,最基础的认证可以访问用户的公共信息。如果用户同意授权,需要主动的点击【Authorize application】按钮。

第2步. 返回用户凭证(code)当用户点击按钮同意授权后,授权服务器将生成一个用户凭证(code),此时授权服务器如何将用户凭证(code)传递给第三方应用呢?当我们向授权服务器提交应用信息时,通常需要填写一个redirect_uri,当我们引导用户进入授权页面时,也会附带一个redirect_uri的信息(如Sign in to GitHub · GitHub),当授权服务器验证两个URL一致时,会通知浏览器跳转到redirect_uri,同时,在redirect_uri后附加用户凭证(code)的相关信息,此时,浏览器返回第三方应用同时携带用户凭证(code)的相关信息。授权后访问的redirect_uri如下:http://tianmaying.com/oauth/github/callback?code=9e3efa6cea739f9aaab2&state=XXX
这样,第二步返回用户凭证(code)就完成了。

授权服务器授权从这一步开始,OAuth2 的授权将有两个重大变化的发生:用户主动行为结束,用户理论上可以不需要再做任何主动的操作,作为第三方应用的我们可以在后台拿到资源服务器上的资源而对用户是不可见的,当用户的浏览器跳到下一个页面时,整个OAuth2的流程已经结束浏览器端行为结束,从OAuth2 的基本流程可以看出,接下来的流程已经不需要和用户进行交互,接下来的行为都在第三方应用与授权服务器、资源服务器之间的交互。我们知道浏览器端的行为实际上是不安全的,甚至安全凭证的传递都是通过URL直接传递的。但是由于用户凭证(code)不是那么敏感,其他攻击者拿到用户凭证(code)后依然无法获取到相应的用户资源,所以之前的行为是允许的。接下来我们看看服务器如何交互来安全的获得授权服务器授权。

第3步. 请求授权服务器授权要拿到授权服务器的授权,需要以下几个信息:client_id 标识第三方应用的id,由授权服务器(Github)在第三方应用提交时颁发给第三方应用client_secret 第三方应用和授权服务器之间的安全凭证,由授权服务器(Github)在第三方应用提交时颁发给第三方应用code 第一步中返回的用户凭证redirect_uri 第一步生成用户凭证后跳转到第二步时的地址state 由第三方应用给出的随机码
我们看到,上述信息还涉及到第三方应用的安全凭证(client_secret),因此要求OAuth要求该请求必须时POST请求,同时,还必须时HTTPS服务,以此保证获取到的验证凭证(Access Token)的安全性。

第4步. 拿到验证凭证(Access Token)当授权服务器拿到第3步中的所有信息,验证通过后,会将Access Token返回给第三方应用。
访问资源

第5步. 请求访问用户资源拿到验证凭证(Access Token)后,剩下的事情就很简单了,资源服务器会提供一系列关于用户资源的API,拿验证凭证(Access Token)访问相应的API即可,例如,在GIthub中,如果你想拿到用户信息,可以访问以下API:GET https://api.github.com/user?access_token=
注意,此时的访问不是通过浏览器进行的,而是服务器直接发送HTTP请求,因此其安全性是可以保证的。

第6步. 返回资源如果验证凭证(Access Token)是正确的,此时资源服务器就会返回资源信息,此时整个OAuth流程就结束了。

### 回答1: OAuth2.0 是一个用于授权的开放标准协议,它允许用户授权第三方应用程序(如社交媒体应用程序)访问他们的受保护资源(如照片、视频等)。OAuth2.0 的主要目的是为了减少用户在第三方应用程序和资源服务提供者之间共享凭证的需求,从而提高安全性并减少安全风险。 OAuth2.0 的主要组成部分包括: 1.授权服务器:用于管理用户授权的服务器,验证用户身份并颁发访问令牌。 2.资源服务器:存储和管理受保护的资源。 3.客户端应用程序:代表用户请求访问受保护资源的应用程序。 4.访问令牌:由授权服务器颁发给客户端应用程序,用于访问资源服务器中受保护的资源。 5.刷新令牌:用于更新访问令牌,以便客户端应用程序可以持续访问受保护的资源。 使用 OAuth2.0,用户不需要将他们的用户名和密码直接提供给第三方应用程序,从而提高了安全性和隐私保护。但是,使用 OAuth2.0 也存在一些安全风险,例如客户端应用程序的恶意行为可能导致访问令牌泄漏。为了解决这些问题,开发者需要遵循 OAuth2.0 的最佳实践,并在实现过程中注意安全性。 ### 回答2: OAuth2.0(开放授权)是一种授权框架,用于授权第三方应用程序访问用户资源。它允许用户将他们在某个资源所有者(如Facebook、Google)处的身份验证信息提供给其他站点或应用程序进行访问,而不需要共享他们的用户名和密码OAuth2.0所解决的问题是用户如何安全地授权第三方应用程序访问他们的个人数据。 在过去,用户通常需要将他们的用户名和密码提供给第三方应用程序,以使其能够访问他们的个人数据。然而,这样的方式存在很多潜在风险,因为用户的敏感信息可能会被盗取或滥用。为了解决这个问题,OAuth2.0允许用户通过对资源所有者进行身份验证来授权第三方应用程序的访问权限。 OAuth2.0通过引入授权服务器和令牌的概念来实现这里的授权过程。当用户希望授权第三方应用程序时,他们将被重定向到授权服务器,在授权服务器上他们输入其凭证进行身份验证。一旦身份验证成功,授权服务器将向第三方应用程序颁发一个访问令牌,该令牌允许第三方应用程序代表用户访问用户资源。 这种方式的优点在于用户不需要共享其用户名和密码,只需授权给第三方应用程序访问特定资源的权限。如果第三方应用程序滥用权限,用户可以随时撤销访问令牌,从而终止对其个人数据的访问。 总之,OAuth2.0是一种安全的授权框架,通过授权服务器和令牌概念,解决了用户如何安全授权第三方应用程序访问其个人数据的问题。 ### 回答3: OAuth2.0是一种开放授权协议,用于在不泄露用户账号密码的情况下,允许用户授权第三方应用或网站访问其受保护的资源。 OAuth2.0协议的主要目的是解决用户在多个应用间共享资源时所面临的问题。在传统的授权方式中,用户需要提供自己的账号密码给第三方应用,这样做存在安全风险,因为第三方应用可能会滥用这些信息。同时,用户在每个应用中都需要输入账号密码,非常繁琐。 OAuth2.0采用了一种更安全且更便捷的授权方式。首先,用户只需要向授权服务器提供一次账号密码,而不是向每个应用提供。授权服务器会颁发一个授权码给第三方应用,该授权码是一次性的,只能用于获取特定资源。第三方应用通过这个授权码访问受保护的资源,而无需知道用户的账号密码。 另外,OAuth2.0还引入了不同的授权模式,以适应不同应用场景。常见的授权模式包括授权码模式、隐式模式密码模式和客户端凭证模式等。每种授权模式都有自己的特点和适用场景。 综上所述,OAuth2.0解决了用户在多个应用间共享资源时的安全和便捷性问题。它可以保护用户的账号密码不被第三方应用获取,同时简化了用户登录过程,提高了用户体验。同时,OAuth2.0的广泛应用也促进了应用间的互操作性和数据共享,推动了互联网生态的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值