OAuth学习笔记(一):初识OAuth

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhuyunier/article/details/86513118

一、OAuth介绍

  OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。
  OAuth允许用户提供一个令牌给第三方网站,一个令牌对应一个特定的第三方网站,同时该令牌只能在特定的时间内访问特定的资源。

二、OAuth2 角色

OAuth 2 标准中定义了以下几种角色:

  • 资源所有者(Resource Owner)
  • 资源服务器(Resource Server)
  • 授权服务器(Authorization Server)
  • 客户端(Client)

1、资源所有者(Resource Owner)
在 OAuth 2 标准中,资源所有者即代表授权客户端访问本身资源信息的用户(User),也就是应用场景中的“开发者A”。客户端访问用户帐户的权限仅限于用户授权的“范围”(aka. scope,例如读取或写入权限)。

2、资源/授权服务器(Resource/Authorization Server)
资源服务器托管了受保护的用户账号信息,而授权服务器验证用户身份然后为客户端派发资源访问令牌。

3、客户端(Client)
在 OAuth 2 中,客户端即代表意图访问受限资源的第三方应用。在访问实现之前,它必须先经过用户者授权,并且获得的授权凭证将进一步由授权服务器进行验证。

三、OAuth2 授权

在这里插入图片描述
1、Authrization Request
客户端向资源所有者请求其授权

2、Authorization Grant(Get)
客户端收到资源所有者的授权许可,这个授权许可是一个代表资源所有者授权的凭据。

3、Authorization Grant(Post)
客户端向授权服务器请求访问令牌,并出示授权许可。

4、Access Token(Get)
授权服务器对客户端身份进行认证,并校验授权许可,如果都是有效的,则发放访问令牌

5、Access Token(Post && Validate)
客户端向资源服务器请求受保护的资源,并出示访问令牌

6、Protected Resource(Get)
资源服务器校验访问令牌,如果令牌有效,则提供服务

三、OAuth2 授权许可

一个授权许可是一个凭据,它代表资源所有者对访问受保护资源的一个授权,是客户端用来获取访问令牌的。

授权类型有四种:authorization code, implicit, resource owner password credentials, and client credentials

  1. Authorization Code
    授权码是授权服务器用来获取并作为客户端和资源所有者之间的中介。代替直接向资源所有者请求授权,客户端定向资源所有者到一个授权服务器,授权服务器反过来指导资源所有者将授权码返回给客户端。在将授权码返回给客户端之前,授权服务器对资源所有者进行身份验证并获得授权。因为资源所有者只对授权服务器进行身份验证,所以资源所有者的凭据永远不会与客户机共享。
  2. Implicit
    隐式授权是为了兼顾到在浏览器中用诸如JavaScript的脚本语言实现的客户端而优化的简化授权代码流程。在隐式授权流程中,不是发给客户端一个授权码,而是直接发给客户端一个访问令牌,而且不会对客户端进行认证。隐式授权提高了一些客户端(比如基于浏览器实现的客户端)的响应能力和效率,因为它减少了获得访问令牌所需的往返次数。
  3. Resource Owner Password Credentials
    资源所有者的密码凭据(比如,用户名和密码)可以直接作为授权许可来获取访问令牌。这个凭据只应该用在高度信任的资源所有者和客户端之间(比如,客户端是系统的一部分,或者特许的应用),并且其它授权模式不可用的时候。
  4. Client Credentials
    客户端凭据通常用作授权许可
  5. Access Token
    访问令牌是用来访问受保护的资源的凭据。一个访问令牌是一个字符串,它代表发给客户端的授权。令牌代表资源所有者授予的对特定范围和访问的时间(PS:令牌是有范围和有效期的),并由资源服务器和授权服务器强制执行。访问令牌可以有不同的格式、结构和使用方法。
  6. Refresh Token
    Refresh Token是用于获取Access Token的凭据。刷新令牌是授权服务器发给客户端的,用于在当前访问令牌已经失效或者过期的时候获取新的访问令牌。刷新令牌只用于授权服务器,并且从来不会发给资源所有者。
    在这里插入图片描述
    刷新的流程如图所示:
  • (A) 客户端请求获取访问令牌,并向授权服务器提供授权许可
  • (B) 授权服务器对客户端身份进行认证,并校验授权许可,如果校验通过,则发放访问令牌和刷新令牌
  • © 客户端访问受保护的资源,并向资源服务器提供访问令牌
  • (D) 资源服务器校验访问令牌,如果校验通过,则提供服务
  • (E) 重复©和(D)直到访问令牌过期。如果客户端直到访问令牌已经过期,则跳至(G),否则不能继续访问受保护的资源
  • (F) 自从访问令牌失效以后,资源服务器返回一个无效的令牌错误
  • (G) 客户端请求获取一个新的访问令牌,并提供刷新令牌
  • (H) 授权服务器对客户端进行身份认证并校验刷新令牌,如果校验通过,则发放新的访问令牌(并且,可选的发放新的刷新令牌)

四、客户注册

在使用该协议之前,客户端向授权服务器注册。
1、客户端类型
OAuth定义了两种客户端类型:

  • confidential:能够维护其凭证的机密性的客户端
  • public:不能维护其凭证的机密性的客户端

2、客户端密码
拥有客户端密码的客户端可以使用HTTP Basic向服务器进行认证,当然前提是授权服务器支持HTTP Basic认证。

例如:Authorization: Basic czZCaGRSa3F0Mzo3RmpmcDBaQnIxS3REUmJuZlZkbUl3

二者选其一的,授权服务器可能支持在请求体中用下列参数包含客户端凭据:

  • client_id:必须的,在授权服务器中注册过的客户端标识符。
  • client_secret:必须的,客户端秘钥。如果秘钥是空字符串的话可以省略该参数。

用这两个参数将客户端凭据包含在请求体中这种方式不推荐,并且应该限制客户端不能直接用HTTP Basic认证方案。

五、协议端点

授权处理用两个授权服务器端点:

  • Authorization endpoint:用于客户端从资源所有者那里获取授权
  • Token endpoint:用于客户端用授权许可交互访问令牌

还有一个端点

  • Redirection endpoint:用于资源服务器通过资源所有者用户代理将包含授权凭据的响应返回给客户端

1、Authorization Endpoint(授权端点)
  授权端点用于和资源所有者交互并获取一个授权许可的。授权服务器必须首先校验资源所有者的身份。
(1)Response Type(响应类型)
  客户端用以下参数通知授权服务器自己渴望的授权类型:

  • response_type:必须的。为了请求一个授权码这个值必须是"code",为了请求一个访问令牌这个值必须是"token"

(2)Redirection Endpoint(重定向端点)
  在完成和资源所有者的交互以后,授权服务器直接将资源所有者的user-agent返回给客户端。授权服务器重定向到这个user-agent

2、Access Token Scope(访问令牌范围)
  授权和令牌端点允许客户端使用“scope”请求参数指定访问请求的范围。反过来,授权服务器使用“scope”响应参数通知客户机它所发放的访问令牌的范围。

六、Obtaining Authorization(获得授权)

为了获得一个访问令牌,客户端需要先从资源所有者那里获得授权。授权是以授权许可的形式来表示的。

OAuth定义了四种授权类型:

  • authorization code
  • implicit
  • resource owner password credentials
  • client credentials

1、Authorization Code Grant
在这里插入图片描述授权码流程如图所示:

  • (A) 客户端通过将资源所有者的用户代理指向授权端点来启动这个流程。客户端包含它的客户端标识符,请求范围,本地状态,和重定向URI,在访问被允许(或者拒绝)后授权服务器立即将用户代理返回给重定向URI。
  • (B) 授权服务器验证资源所有者(通过用户代理),并确定资源所有者是否授予或拒绝客户端的访问请求。
  • (C ) 假设资源所有者授权访问,那么授权服务器用之前提供的重定向URI(在请求中或在客户端时提供的)将用户代理重定向回客户端。重定向URI包括授权码和前面客户端提供的任意本地状态。
  • (D) 客户端用上一步接收到的授权码从授权服务器的令牌端点那里请求获取一个访问令牌。
  • (E) 授权服务器对客户端进行认证,校验授权码,并确保这个重定向URI和第三步©中那个URI匹配。如果校验通过,则发放访问令牌,以及可选的刷新令牌。

2、Implicit Grant
隐式授权用于获取访问令牌(它不支持刷新令牌),它针对已知的操作特定重定向URI的公共客户端进行了优化。这些客户端通常在浏览器中使用脚本语言(如JavaScript)实现。

因为它是基于重定向的流程,所以客户端必须有能力和资源所有者的用户代理(典型地,是一个Web浏览器)进行交互,同时必须有能力接收来自授权服务器的重定向请求。

隐士授权类型不包含客户端身份验证,它依赖于资源所有者的存在和重定向URI的注册。由于访问令牌被编码到重定向URI中,所以它可能暴露给资源所有者以及同一台设备上的其它应用。
在这里插入图片描述隐式授权流程如图所示:

  • (A) 客户端引导资源所有者的user-agent到授权端点。客户端携带它的客户端标识,请求scope,本地state和一个重定向URI。
  • (B) 授权服务器对资源所有者(通过user-agent)进行身份认证,并建立连接是否资源所有者允许或拒绝客户端的访问请求。
  • © 假设资源所有者允许访问,那么授权服务器通过重定向URI将user-agent返回客户端。
  • (D) user-agent遵从重定向指令
  • (E) web-hosted客户端资源返回一个web页面(典型的,内嵌脚本的HTML文档),并从片段中提取访问令牌。
  • (F) user-agent执行web-hosted客户端提供的脚本,提取访问令牌
  • (G) user-agent将访问令牌传给客户端

3、Resource Owner Password Credentials Grant
资源所有者密码凭证授予类型适用于资源所有者与客户端(如设备操作系统或高度特权应用程序)存在信任关系的情况。授权服务器在启用这种授予类型时应该特别小心,并且只在其他授权流程不可行的时候才允许使用。

这种授权类型适合于有能力维护资源所有者凭证(用户名和密码,典型地,用一个交互式的表单)的客户端。
在这里插入图片描述资源所有者密码凭证流程如图:

  • (A) 资源所有者提供他的用户名和密码给客户端
  • (B) 客户端携带从资源所有者那里收到的凭证去授权服务器的令牌端点那里请求获取访问令牌
  • © 授权服务器对客户端进行身份认证,并校验资源所有者的凭证,如果都校验通过,则发放访问令牌

4、Client Credentials Grant
客户端用它自己的客户单凭证去请求获取访问令牌
在这里插入图片描述客户端凭证授权流程如图所示:

  • (A) 客户端用授权服务器的认证,并请求获取访问令牌
  • (B) 授权服务器验证客户端身份,如果严重通过,则发放令牌

参考文章:https://www.cnblogs.com/cjsblog/p/9174797.html
https://www.cnblogs.com/Wddpct/p/8976480.html

猜你喜欢

转载自blog.csdn.net/zhuyunier/article/details/86513118