首页 > 其他分享 >OAuth2

OAuth2

时间:2024-04-01 14:02:49浏览次数:12  
标签:令牌 OAuth2 模式 访问 服务器 授权 客户端

前言

传统的客户端-服务器身份验证模型中存在的问题。在这种模型中,客户端通过使用资源所有者的凭据对服务器进行身份验证,从而请求访问受限资源(受保护的资源)。为了使第三方应用程序能够访问受限资源,资源所有者需与第三方共享其凭据。然而,这种做法存在一些问题和限制:

  • 第三方应用程序通常需要明文存储资源所有者的凭据(通常是密码),以备将来使用。
  • 服务器需要支持密码身份验证,而且密码身份验证存在安全弱点
  • 第三方应用程序可能获得对资源所有者受保护资源的过于广泛的访问权限,而资源所有者无法限制对资源的访问时长或访问的资源子集。
  • 资源所有者无法单独撤销对个别第三方的访问权限,而不影响所有第三方的访问权限,只能通过更改第三方的密码来执行此操作。
  • 如果任何第三方应用程序遭到破坏,将导致最终用户密码以及由该密码保护的所有数据的泄露

什么是OAuth 2.0

OAuth 2.0(开放授权2.0)是一种用于授权的开放标准,允许用户让第三方应用访问他们在某一网站上存储的私有资源,而无需将用户名和密码提供给第三方应用。OAuth 2.0是OAuth协议的升级版本,提供了更简化和灵活的授权流程。

在OAuth 2.0中,授权过程包括以下主要角色:

  1. 资源所有者(Resource Owner): 即用户,是拥有受保护资源的实体。用户通过授权第三方应用访问他们的资源。
  2. 客户端(Client): 即第三方应用,需要访问资源所有者的受保护资源。
  3. 授权服务器(Authorization Server): 负责验证资源所有者并颁发访问令牌给客户端。授权服务器和资源服务器可以是同一个服务或不同的服务。
  4. 资源服务器(Resource Server): 存储受保护资源的服务器,通过访问令牌验证并提供受保护资源。

在OAuth 2.0中,定义了多种授权方式(授权码模式、隐式授权模式、密码模式、客户端凭证模式等),客户端通过与授权服务器交互,获取访问令牌,然后使用访问令牌访问受保护资源。

Oauth2 四种授权模式

授权码模式

授权码模式(Authorization Code Grant)是 OAuth 2.0 中的一种常见的授权模式,适用于客户端需要访问用户资源,但又不能直接使用用户的凭证的场景。以下是授权码模式的流程:

  1. 客户端请求授权:
    • 用户访问客户端,客户端将用户导向授权服务器,并包含以下参数:
      • response_type=code:表示使用授权码模式。
      • client_id:标识客户端。
      • redirect_uri:授权成功后重定向的URI。
      • scope:请求的权限范围。
  1. 用户同意授权:
    • 用户在授权服务器登录并同意授权请求。
  1. 授权服务器发放授权码:
    • 授权服务器验证用户身份和授权请求后,向客户端发放授权码。
  1. 客户端获取访问令牌:
    • 客户端通过后端将授权码和客户端凭证发送到授权服务器。
    • 包含以下参数:
      • grant_type=authorization_code:表示使用授权码模式。
      • code:授权码。
      • redirect_uri:必须与步骤1中的重定向URI一致。
      • client_id:客户端标识。
      • client_secret:客户端秘钥(可选)。
  1. 授权服务器发放访问令牌:
    • 授权服务器验证授权码和客户端凭证,如果有效则发放访问令牌。
  1. 客户端使用访问令牌:
    • 客户端可以使用访问令牌访问用户的受保护资源。

授权码模式相对于其他模式更安全,因为客户端不直接接触用户凭证,且在授权码的交换过程中可以使用安全的后端通信。

隐式授权模式(简化模式)

隐式授权模式(Implicit Grant)是 OAuth 2.0 中的一种授权模式,通常用于移动应用或纯前端应用。以下是隐式授权模式的流程:

  1. 发起认证请求(Authorization Request):
    • 客户端(浏览器或移动应用)向授权服务器发送认证请求。
    • 请求包括:
      • response_type 参数,设为 "token",表示使用隐式授权模式。
      • client_id 参数,标识客户端。
      • redirect_uri 参数,用于接收授权服务器的响应。
  1. 用户身份验证和授权:
    • 用户在授权服务器上进行身份验证。
    • 用户同意授权请求,授权服务器生成访问令牌。
  1. 生成令牌(Access Token):
    • 授权服务器生成访问令牌。
    • 生成的访问令牌直接包含在重定向 URI 中,作为 URI 片段的一部分。
  1. 重定向到客户端:
    • 授权服务器将包含访问令牌的重定向 URI 返回给客户端。
    • 重定向 URI 中的访问令牌可通过前端 JavaScript 访问。
  1. 客户端使用令牌:
    • 客户端从重定向 URI 中提取访问令牌。
    • 客户端可以使用令牌访问资源服务器上的受保护资源。

请注意,相比于其他授权模式,隐式授权模式不涉及客户端的后端服务器,而是直接在浏览器中处理。这使得它适用于前端应用,但也带来了一些安全性的考虑。因此,建议在可能的情况下,优先考虑授权码模式。

密码模式

密码模式(Password Grant)是 OAuth 2.0 中的一种授权模式,它允许客户端使用用户的用户名和密码直接向授权服务器请求访问令牌。密码模式通常用于由受信任的客户端直接与资源所有者的服务进行通信,而不通过用户代理的情况。

以下是密码模式的流程:

  1. 客户端向授权服务器发送请求:
    • 客户端通过安全通道直接向授权服务器发送包含以下参数的请求:
      • grant_type:固定为 "password",表示使用密码模式。
      • client_id:标识客户端。
      • client_secret:客户端的秘密(如果有的话)。
      • username:用户的用户名。
      • password:用户的密码。
      • scope:请求的范围(可选)。
  1. 授权服务器验证用户身份:
    • 授权服务器验证客户端的身份和用户的身份。
    • 如果验证成功,授权服务器生成访问令牌和可能的刷新令牌。
  1. 授权服务器响应:
    • 授权服务器以 JSON 格式返回访问令牌和刷新令牌。

密码模式的使用场景通常受到一些限制,因为它需要客户端直接存储用户的密码。因此,它主要适用于受信任的客户端,如后端服务器。在使用密码模式时,需要特别注意确保安全性,并确保通过安全通道(如 HTTPS)进行通信。

客户端凭证模式

客户端凭证模式(Client Credentials Grant)是 OAuth 2.0 中的一种授权模式,适用于无需用户参与的情况,通常用于客户端自身访问其拥有权限的资源。

以下是客户端凭证模式的流程:

  1. 客户端向授权服务器发送请求:
    • 客户端通过安全通道直接向授权服务器发送包含以下参数的请求:
      • grant_type:固定为 "client_credentials",表示使用客户端凭证模式。
      • client_id:标识客户端。
      • client_secret:客户端的秘密。
  1. 授权服务器验证客户端身份:
    • 授权服务器验证客户端的身份,确保客户端合法且有权限使用此模式。
  1. 授权服务器响应:
    • 授权服务器以 JSON 格式返回访问令牌。
    • 响应中包含访问令牌以及令牌的有效期等信息。

客户端凭证模式适用于那些不涉及用户的、由客户端自己访问自己资源的情况,例如后端服务之间的通信。在使用客户端凭证模式时,同样需要注意保障传输安全性,并限制客户端凭证的使用范围.

如何处理OAuth2的刷新令牌

当使用OAuth2时,如果访问令牌过期,客户端应用程序可以使用刷新令牌从授权服务器获取一个新的访问令牌。刷新令牌是一个特殊的令牌,它允许您在不重新输入凭据的情况下重新获得访问权限。刷新令牌应该在安全的环境中存储,并且不应该被暴露给未授权的用户或应用程序。
在使用刷新令牌时,应遵循以下最佳实践:
1存储刷新令牌:刷新令牌应该存储在安全的环境中,例如客户端应用程序的服务器端或受信任的安全存储中。不要将其存储在客户端应用程序本身中,因为这可能会导致安全漏洞。
2刷新令牌的生命周期:刷新令牌应该有一个有限的生命周期,并且应该定期更新。这有助于确保系统的安全性,并减少未经授权的访问风险。
3刷新令牌的保密性:刷新令牌应该保密,并且不应该被暴露给未授权的用户或应用程序。如果刷新令牌被泄露,攻击者可能会使用它来获取访问权限。
4刷新令牌的安全传输:在传输刷新令牌时,应使用安全的通信协议,例如HTTPS,以确保信息不会被拦截或篡改。
5刷新令牌的撤销:如果刷新令牌被泄露或不再需要,应该能够撤销它。这有助于确保系统的安全性,并减少未经授权的访问风险。
总之,处理OAuth2的刷新令牌时,应该遵循最佳实践,确保刷新令牌在安全的环境中存储、传输和使用,并且应该有一个有限的生命周期和能够撤销的机制

如何存储和传输敏感信息

使用OAuth2时,不建议直接存储和传输敏感信息,比如用户名和密码。这是由于OAuth2协议自身的设计,它鼓励使用临时凭证(例如访问令牌和刷新令牌)进行安全地授权和认证,而不是直接使用敏感的用户信息。

以下是使用OAuth2时存储和传输敏感信息的常见做法:

  1. 用户登录并授权:用户在客户端应用程序(比如网站或移动应用)上输入他们的用户名和密码,然后客户端应用程序将用户提交的信息发送到授权服务器进行验证。如果用户信息验证成功,授权服务器将生成一个访问令牌并将其发送回客户端应用程序。
  2. 访问令牌的使用:客户端应用程序存储访问令牌,并将其包含在每个请求中,以证明它们的身份。然而,客户端应用程序不应存储敏感的用户名和密码信息。
  3. 刷新令牌的使用:访问令牌通常有一个有限的生命周期,当它过期时,客户端应用程序可以使用刷新令牌从授权服务器获取一个新的访问令牌。同样地,客户端应用程序不应存储敏感的用户名和密码信息。
  4. 敏感信息的存储:敏感的用户信息(如密码)应存储在安全的环境中,如数据库或密钥管理系统中。这些信息应被适当地加密和保护,以防止未经授权的访问。
  5. 安全的通信协议:在传输敏感信息和访问令牌时,应使用安全的通信协议(如HTTPS)以确保信息不被拦截或篡改。

优缺点

使用OAuth2有以下几个优点:

  1. 安全性:OAuth2协议允许客户端不接触用户密码,这提高了系统的安全性。服务器端也更容易集中保护用户信息,因为所有的认证和授权信息都集中在服务器端,而不是分散在各个客户端。
  2. 广泛使用:OAuth2是一个广泛应用的认证标准,已经被许多公司和组织采用,因此,使用OAuth2可以使你的应用更容易被其他公司或组织集成。
  3. 令牌短寿命和封装:OAuth2使用短寿命的访问令牌,这减少了泄露和攻击的风险。并且,OAuth2还提供了灵活的令牌封装机制,这使得不同的客户端和应用可以方便地使用令牌来获取授权。
  4. 资源服务器和授权服务器解耦:在OAuth2中,资源服务器和授权服务器是分离的,这使得系统的结构清晰,同时也方便了不同系统之间的集成。
  5. 集中式授权:OAuth2通过专门的服务来进行授权认证,这简化了客户端的处理。客户端只需要与这个授权服务器进行交互,就可以获得授权。

然而,使用OAuth2也存在一些缺点:

  1. 对接流程长:使用OAuth2进行认证和授权需要理解并实现许多概念,这可能会使对接流程变得相对复杂和耗时。
  2. 使用不当可能造成安全漏洞:虽然OAuth2协议本身是安全的,但如果使用不当,例如令牌管理不善或者授权过大,都可能导致安全漏洞。
  3. 不同的实现方式可能存在兼容性问题:不同的公司和组织可能会根据OAuth2协议实现自己的认证系统,这可能会导致不同系统之间的兼容性问题。

标签:令牌,OAuth2,模式,访问,服务器,授权,客户端
From: https://blog.csdn.net/weixin_44989660/article/details/137230303

相关文章

  • Spring Cloud整合Spring Security Oauth2
    前言在当今数字化时代,随着企业业务规模和复杂性的不断增加,传统的单体应用架构已经难以满足日益增长的需求。微服务架构的兴起,以其高度模块化、可扩展性和可维护性的优势,逐渐成为企业架构升级的首选方案。然而,随着微服务的普及,如何保障服务的安全性、实现用户身份的统一管理......
  • 24.Spring Security OAuth2
    1.基本概念1.1.什么是认证进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,输入账号和密码登录微信的过程就是认证。系统为什么要认证?认......
  • 基于security-oauth2-autoconfigure实现的OAuth2迁移到更现代的解决方案,Spring Securi
    目录OAuth2资源服务器配置步骤1:添加依赖步骤2:配置资源服务器OAuth2客户端配置(可选)/**其他应用作为OAuth2客户端步骤1:添加依赖步骤2:配置OAuth2.0客户端/**应用同时作为OAuth2客户端步骤1:配置OAuth2.0客户端控制器示例结合使用OAuth2与JWT        ......
  • 【SpringSecurity】十七、OAuth2授权服务器 + 资源服务器Demo
    文章目录0、库表准备:1、项目结构2、基于数据库的认证3、授权服务器配置4、授权服务器效果测试5、资源服务器配置相关......
  • spring-boot spring-security oauth2 /oauth/token报401,403 问题
    2024-03-1012:20:55.281INFO58776---[nio-8002-exec-2]o.s.web.servlet.DispatcherServlet:InitializingServlet'dispatcherServlet'2024-03-1012:20:55.283INFO58776---[nio-8002-exec-2]o.s.web.servlet.DispatcherServlet:Completedi......
  • OAuth2.0实战使用JWT令牌认证
    JWT分为三部分:头部、载荷、签名。如下:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsicmVzMSJdLCJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE3MDU5OTQ0MzgsImF1dGhvcml0aWVzIjpbIlJPTEVfYWRtaW4iXSwianRpIjoiM2RiYjVkNGUtN2Q3My00ODI3LTlkOGYtMmI3OGVmMmVmZTE......
  • OAuth2 认证详解
    摘自网上内容,写的很好。是一种开放标准的授权框架,用于授权第三方应用程序访问受保护的资源,而无需提供直接的用户名和密码。它提供了一种安全的授权机制,允许用户授权第三方应用程序代表他们访问受保护的资源。下面将详细解释OAuth2的认证过程和相关概念。OAuth2认证的主要参与者......
  • OAuth2.0详细介绍与实践
    一、OAuth2.0介绍1.1概述OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth......
  • OAuth2.0授权
    OAuth2.0OAuth2.0是一个开放标准,允许用户授权第三方应用程序访问他们存储在另外的服务器上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。OAuth2.0协议的认证流程,简单理解,就是允许我们将之前的授权和认证过程交给一个独立的第三方进行担保。OAuth2.0协议......
  • oauth2.1.sql
    --------------------------------1.创建数据库------------------------------CREATEDATABASEIFNOTEXISTSoauth2_serverDEFAULTCHARACTERSETutf8mb4DEFAULTCOLLATEutf8mb4_general_ci;--------------------------------2.创建表---------------------......