在古代战争中,出兵的权力往往包含在一件事上——士兵护身符。 它是一种由当局精心制作并分成两半的令牌,只有当两半合并进行验证时,持有者才能获得指挥军队的合法权力。 这份实物文件保证了军事行动的安全和命令执行的有效性,是授权和身份验证的生动体现。
在现代网络世界中,OAuth 2 中体现了类似的授权机制协议中的 0 个令牌。
oauth2.0 代币就像古代战场上的护身符,是权力转移和身份验证的关键工具。 然而,在数字世界中,代币已经从实体形式演变为虚拟形式,但它所承载的授权使命和背后的安全逻辑不仅与古代代币一脉相承,而且在技术和规模上也得到了前所未有的扩展和深化。
OAuth 2 中的令牌在0协议的各种授权模式中,它被用作授权决策的结果和对服务的后续访问的身份。 服务端对令牌进行校验,确保请求者有权执行请求的操作,令牌本身携带的信息可以包括用户的身份、有效时间、授权范围等关键数据。
之前,我们对 OAuth2 进行了审查0 授权模式执行 **oauth2。0:授权模式已完全解析。
常见的 Token 类型包括访问令牌、刷新令牌和 idToken,每种令牌都有其特定的角色、差异和应用场景
访问令牌用于身份验证,因为访问令牌有一定的有效期,过期后不再有效,从而保证系统的安全性。 过期后,客户端通常需要通过刷新令牌获取新的访问令牌,因此访问令牌也称为“短令牌”。
格式要求
AccessToken 没有从 OAuth 协议级别限制固定格式,它可以是任何格式,但现在 JWT 在一般场景中已经习惯了。 不建议用户直接解析accesstoken来获取其中的信息(因为accesstoken的格式不是JWT的强制要求),需要根据实际的授权服务设计规范来确定。
应用场景
accesstoken 仅用于授权,可用于限制对受保护资源的访问。 例如用户界面权限管理、应用间接口权限管理,但在标准协议级别,accesstoken 不会用于身份验证(因为 accesstoken 代表更多的是“权限范围”,也就是保护 API)。
发出访问令牌后,表示的主体可以是“人”或“设备”。
建议的解决方案中的到期日期配置是什么?
出于安全原因,accesstoken 的有效期通常很短,但这也需要根据具体情况来决定。 例如:
在不建议用户参与的场景(如客户端模式)中,建议稍长一些。
在有用户参与的场景下:例如,建议授权码模式和密码模式稍微短一点,可以依靠refreshtoken实现登录状态的续订; 但是,建议配置稍长的配置,如隐式授权模式,因为该模式不支持刷新令牌,无法实现登录状态续订。
如果一个应用同时以客户端模式和用户模式使用,业务端需要考虑实际的业务场景和代币本身的应用场景。
当用户通过客户端应用程序访问其资源服务器上的受保护资源时,授权服务器不仅会向客户端返回一个访问令牌,还会生成一个刷新令牌,当“短令牌”访问令牌到期时,该令牌将发送到授权服务器请求新的访问令牌,而无需用户登录并再次授权, 从而改善用户体验并确保系统的安全性。因此,RefreshToken 也称为“长令牌”。
格式要求
OAuth 2 中的 RefreshToken0 协议中没有特定的格式,下面是一个 refreshtoken 的例子(注意实际的 refreshtoken 通常是加密或编码的,以确保其安全性,不一定是 JSON 格式)。
1eyjhbgcioijiuzi1niisinr5cci6ikpxvcj9.eyjpc3mioijodhrwczovl2f1dgguawquy29tiiwicmvmcmvzaf90b2tlbl9pzci6ijeymzq1njc4otailcjlehaioje2mdk4ntgwmdasinnjb3blijoib3blbmlkihbyb2zpbgugzw1hawwilcjhdxrob3jpdhkioijbuelfq0xjru5uihbyaxzhdguifq.rkks7lp4lohydy_fvcokcfhs3ftinilwg8yrijeql5o虽然上面的示例看起来像 JWT(JSON Web 令牌),但实际上 RefreshToken 可以是任何格式,例如,它可以只是一个长字符串,也可以是具有多个属性的自定义序列化对象。
尽管 OAuth 2 未使用 RefreshToken 的特定格式0 规范是严格限制的,但为了安全性和可管理性,大多数现代 OAuth 20 实现将选择使用 JWT 或至少以某种结构化格式存储 RefreshToken,并在存储和传输过程中保护它。 同时,Refreshtoken 还将实施到期日期控制、黑名单机制等安全策略。
应用场景
当用户通过身份验证时,服务器不仅会为客户端颁发短期访问令牌以访问受保护的资源,还会颁发长期存储的刷新令牌。 由于其有效期有限(例如,从几个小时到几天不等),访问令牌在到期后不能使用; 在这种情况下,客户端可以携带 refreshtoken 向认证服务器请求新的 accesstoken,整个过程不需要用户再次登录。 这种设计不仅确保了系统的安全性(因为即使访问令牌被泄露,攻击者也无法使用它来获取新的访问令牌或更新刷新令牌),并改善了用户体验(避免频繁登录)。 RefreshToken 通常用于支持单点登录 (SSO) 环境和 OAuth 20 等开放授权协议,确保用户可以在多个连接的应用程序之间保持长期登录状态,并根据需要动态更新访问权限。
建议的解决方案中的到期日期配置是什么?
RefreshToken 建议方案中的到期日期配置通常很长,以便在 AccessToken 过期后可以长时间保持用户的登录状态,而无需重新进行身份验证。 它的有效期可以是几天、几周甚至几个月,具体取决于系统的安全策略和用户体验需求。 此外,系统还应该设计相应的逻辑来撤销或更新 RefreshToken,并限制单个 RefreshToken 的次数或生命周期,以防止 RefreshToken 使用不当导致的潜在威胁。
在 OAuth 2 中在 0 协议框架下,idToken 是特定于 OpenID Connect (OIDC) 的身份令牌。 [注意:OpenID Connect 基于 OAuth 2 构建。0以上的一组认证层协议,主要用于解决用户身份识别和认证问题。 】
当用户通过 OAuth 2 时除了获取访问资源所需的 AccessToken 外,OpenID Connect 还允许客户端请求 IDTOKEN。 客户端接收并验证 idtoken 后,可以根据其内容确定用户的身份,并在必要时将此信息用于进一步的业务逻辑处理或用户界面呈现。
IdToken 通常采用 JSON Web 令牌 (JWT) 的格式,它由三部分组成:标头、有效负载和签名“建立联系。
JWT 标头包含令牌的元数据信息,例如加密算法;
JWT Payload 存储多个 JSON 编码的声明,这些声明提供有关经过身份验证的用户身份的信息;
JWT 签名通过对前两部分进行签名来确保令牌内容的完整性和可信度。
为了正确处理 idtoken,客户端需要根据 header 中的说明验证签名,并检查 payload 中每个声明的有效性,包括但不限于确认 token 没有过期、受众匹配自身以及 nonce 值的有效性。
应用场景
idToken 在 OpenID Connect 中的核心应用场景是用户认证和授权
用户身份验证:当用户登录到启用了 OpenID Connect 的应用程序时,服务器将返回一个 ID 令牌,其中包含用户的标识符和其他相关信息。 应用程序可以通过验证此令牌来确认用户的身份。
单点登录 (SSO):在多个应用程序之间实现单点登录时,用户只需在一个位置登录,即可自动登录所有其他应用程序。 在此方案中,每个应用程序都会收到一个 ID 令牌,其中包含用户的标识符和其他相关信息。
用户信息获取:idtoken除了用户的身份信息外,还可以包含用户的其他信息,如用户名、邮箱地址、**号码等。 应用程序可以通过解析 ID 令牌来获取此信息,而不必直接从数据库或其他位置获取它。
安全传输:由于ID令牌是安全令牌,因此可用于保护敏感信息的安全传输。 例如,当应用程序需要将用户信息发送到服务器时,它可以将该信息放在 ID 令牌中并将其发送到服务器,这样就不必以明文形式传输。
推荐解决方案中的有效期配置是什么?
idToken 推荐的配置有效期通常较短,以降低安全风险,同时可以与 Refresh Token 一起使用,实现自动续费。 具体有效期根据应用的安全要求和用户体验进行调整,旨在保证用户会话的连续性,同时控制身份凭证滥用的风险。 过期的令牌通过服务端逻辑进行监控和处理,并根据业务规则实施刷新策略,同时兼顾安全性和便利性。
在当今信息流量大的网络世界中,OAuth 20的代币机制无疑是数字社会中至关重要的桥梁。 AccessToken、RefreshToken等Token机制作为坚实的安全屏障,不仅保护了用户个人数据的隐私,还为服务之间的交互提供了一种安全、灵活、便捷的方式。 有了这个现代版本的护身符,用户可以精确地管理对其资源的访问,并确保每次授权都基于证据。