• Oauth2的核心概念


    Oauth2

    OAuth2最简向导

    川崎高彦:OAuth2领域专家,开发了一个OAuth2 sass服务,OAuth2 as Service,并且做成了一个公司再融资的过程中为了向投资人解释OAuth2是什么,于是写了一篇文章,《OAuth2最简向导》

    什么是OAuth2

    OAuth(Open Authorization,开放授权)是一个开放标准的授权协议,允许用户授权第三方应用访问他们存储在资源服务上受保护的信息,而不需要将用户名和密码提供给第三方应用,解耦了认证和授权。

    OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。

    OAuth 2.0 是目前最流行的授权机制,用来授权第三方应用,获取用户数据。

    简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。

    OAuth 2.0 是一种授权机制,主要用来颁发令牌(token)。OAuth 的核心就是向第三方应用颁发令牌

    令牌与密码

    令牌token与密码password的作用是一样的,都可以进入系统,但是有三点差异。

    1.令牌是短期的,到期会自动失效,用户自己无法修改。密码一般长期有效,用户不修改,就不会发生变化。
    
    2.令牌可以被数据所有者撤销,会立即失效。
    
    3.令牌有权限范围(scope),密码一般是完整权限。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    OAuth2术语

    客户应用:通常是一个Web或者无线应用,它需要访问用户的受保护资源
    
    资源服务器:是一个web站点或者web serviceAPI,用户的受保护数据保存于此
    
    授权服务器:在客户应用成功认证并获得授权之后,向客户应用颁发访问令牌Access Token
    
    资源拥有者:资源的拥有人,想要分享某些资源给第三方应用
    
    客户凭证:客户的clientld和密码用于认证客户
    
    令牌: 授权服务器在接收到客户请求后,颁发的访问冷牌
    
    作用域:客户请求访问令牌时,由资源拥有者额外指定的细分权限(permission)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    令牌类型

    刷新令牌(Refresh Token):用于去授权服务器获取一个新的访问令牌
    
    访问令牌(Access Token):用于代表一个用户或服务直接去访问受保护的资源
    
    授权码(Authorization Code Token):仅用于授权码授权类型,用于交换获取访问令牌和刷新令牌
    
    Bearer Token:不管谁拿到Token都可以访问资源
    
    Proof of Possession(PoP)Token:可以校验client是否对Token有明确的拥有权
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Oauth2角色

    在这里插入图片描述

    1、客户端

    本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源。

    2、资源拥有者

    通常为用户,也可以是应用程序,即该资源的拥有者。

    3、授权服务器(认证服务器)

    对资源拥有的身份进行认证、对访问资源进行授权。客户端要想访问资源需要通过认证服务器由资源拥有者授权后方可访问。

    4、资源服务器

    存储资源的服务器,如某视频网站存储的视频资源。

    Oauth2认证流程

    1.客户端请求第三方授权

    如CSDN登录使用第三方授权登录

    在这里插入图片描述
    2.资源拥有者同意给客户端授权

    资源拥有者扫描二维码表示同意给客户端授权

    在这里插入图片描述
    第三方会对资源拥有者身份进行验证, 验证通过后,第三方会询问用户是否给客户端授权访问自己的数据,用户点击“授权操作”表示同意授权,第三方认证服务器会颁发一个授权码,并重定向到客户端网站
    在这里插入图片描述

    3、客户端获取到授权码,请求认证服务器申请令牌

    客户端应用程序请求认证服务器,请求携带授权码

    4、认证服务器向客户端响应令牌

    认证服务器验证客户端请求的授权码,如果合法则给客户端颁发令牌,令牌是客户端访问资源的通行证。当客户端拿到令牌后,用户就可以看到已经登录成功。

    5、客户端请求资源服务器的资源

    客户端携带令牌访问资源服务器的资源。

    客户端携带令牌请求访问第三方服务器获取用户的基本信息

    6、资源服务器返回受保护资源

    资源服务器校验令牌的合法性,如果合法则向用户响应资源信息内容。

    注意:认证服务器和资源服务器可以在同一台服务器上,如前后端分离的服务后台,它即供认证服务(认证服务器,提供令牌),客户端通过令牌来从后台获取服务(资源服务器);

    Oauth2授权模式

    OAuth是一种用来规范令牌(Token)发放的授权机制,主要包含了四种授权模式:授权码模式、简化模式、密码模式和客户端模式

     授权码模式(Authorization Code)
     
     隐式授权模式(Implicit)
     
     密码模式(Resource Owner Password Credentials)
     
     客户端模式(Client Credentials
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    其中常用:授权码模式和密码模式 选择最适合自己的那一种,向第三方应用颁发令牌

    授权码模式

    授权码模式是最能体现OAuth2协议,流程如下:

    1.. 客户端将用户导向认证服务器
    
    2. 用户决定是否给客户端授权
    
    3. 同意授权后,认证服务器将用户导向客户端提供的URL,并附上授权码
    
    4. 客户端通过重定向URL和授权码到认证服务器换取令牌
    
    5. 校验无误后发放令牌
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    步骤1:客户端申请认证URI,包含以下参数:

    response_type:表示授权类型,此处的值固定为code,标识授权码模式
    
    client_id:表示客户端的ID
    
    redirect_uri:表示重定向URI,可选
    
    scope:表示申请的权限范围,可选
    
    state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    步骤4:客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

    grant_type:表示使用的授权模式,此处的值固定为authorization_code
    
    code:表示上一步获得的授权码
    
    redirect_uri:表示重定向URI,且必须与A步骤中的该参数值保持一致
    
    client_id:表示客户端ID
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    密码模式

    密码模式中,用户向客户端提供用户名和密码,客户端通过用户名和密码到认证服务器获取令牌。流程如下:

    1. 用户向客户端提供用户名和密码
    
    2. 客户端向认证服务器换取令牌
    
    3. 发放令牌
    
    • 1
    • 2
    • 3
    • 4
    • 5

    步骤2:客户端发出HTTP请求,包含以下参数:

    grant_type:表示授权类型,此处的值固定为password
    
    username:表示用户名
    
    password:表示用户的密码
    
    scope:表示权限范围,可选
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    google abseil c++ Tip of the Week #65: Putting Things in their Place 把对象放入容器的方式
    以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)
    【Python3】【力扣题】258. 各位相加
    如何查找外文文献?
    Java21新增特性
    计算机毕业设计SSM电商后台管理系统【附源码数据库】
    Python数据可视化案例
    网站风格变黑白的方法,用css或javascript方法将网站改为灰色
    大数据开发的前景和就业如何?该如何去学习它?
    潜伏 12 年,这个漏洞危及所有主要发行版 Linux 的 root 权限
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/127001639