Authentication 如何使用PKCE授权流注销?

Authentication 如何使用PKCE授权流注销?,authentication,oauth,oauth-2.0,okta,Authentication,Oauth,Oauth 2.0,Okta,如果我有一个app和一个api。如果app通过授权服务器登录,并随每个请求发送authorization:Bearer xxx头,则api可以在本地验证令牌。 当用户注销(通过身份验证服务器),但令牌尚未过期时,如果有人检索此令牌,他们将能够发出请求(如果令牌的身份验证在服务器上本地完成),是否正确?如果是这样,为什么这样的注销流被认为是安全的 编辑:澄清主要问题:为什么PKCE流被认为是安全的,如果用户注销时其访问令牌仍然有效(假设我们进行本地令牌验证)Okta/introspect可以告诉您

如果我有一个
app
和一个
api
。如果
app
通过授权服务器登录,并随每个请求发送
authorization:Bearer xxx
头,则
api
可以在本地验证令牌。 当用户注销(通过身份验证服务器),但
令牌
尚未过期时,如果有人检索此
令牌
,他们将能够发出请求(如果令牌的身份验证在服务器上本地完成),是否正确?如果是这样,为什么这样的注销流被认为是安全的


编辑:澄清主要问题:为什么PKCE流被认为是安全的,如果用户注销时其访问令牌仍然有效(假设我们进行本地令牌验证)

Okta/introspect可以告诉您active是真是假,如果您没有关闭API,您可以在每个请求上检查是否很难访问令牌,这可能是一个很好的理由,为什么它不是按定义不安全

但是,提供注销选项是一个好主意。OAuth2具有“撤销”功能,以确保令牌被撤销:


并非每台服务器都支持此功能。

行为概述

与旧的独立web应用相比,OAuth具有更大的关注点分离:

  • 您可以登录UIs
  • 这被外部化到授权服务器
  • 以固定/短的生存期颁发访问令牌
  • 访问令牌用作API消息凭据
  • 访问令牌可能被发送到其他组件并从那里使用
注销时:

  • 您从应用程序中删除令牌
  • 您重定向以告知授权服务器用户不再登录到任何UI
  • 这不会使访问令牌无效
令牌存储

令牌应存储在私有内存或受保护的存储中,以便攻击者无法轻松访问它们。然后,您的应用程序在注销过程中删除令牌,使攻击者无法再尝试访问这些令牌

威胁

有一个关于被盗代币的章节,其中建议使用上述存储方式,并保持代币的短寿命。访问令牌最常见的行业默认值是60分钟

恶意方窃取令牌的主要风险是通过跨站点脚本。XSS风险与注销无关。应定期进行安全测试,以确保减轻XSS风险

安全性和性能之间的平衡

UI可能会告诉授权服务器令牌已被吊销。但是,API需要在每个API请求上调用授权服务器来检查令牌撤销。这将导致性能不佳

API体系结构

我一直致力于在OAuth安全API中使用和内省,因为它提供了实际API的最佳控制,以及良好的可扩展性和性能

有了这一点,如果您真的想让access令牌在注销后不可用,而又不破坏性能,那么您的UI可以在注销过程中执行以下操作:

  • 在授权服务器上撤消访问令牌(如果支持)
  • 调用API,要求它们删除访问令牌的缓存声明

请原谅我的无知,但注销的全部目的不是为了确保您用于发出请求的任何凭据不再有效吗?这就是让我绊倒的地方。无状态JWT似乎(至少对我来说)不安全。您何时选择加入或退出使用此类授权流?那么您认为会出现哪些具体/现实问题?有时候,像这样的技术问题不值得纠结——当用户注销你的应用程序时,你应该同时删除令牌。这就是大多数OAuth UI的工作方式,它们并不被认为是不安全的。我正在考虑一个假设场景,即攻击者在您注销后获得您的
access\u令牌,但该令牌尚未过期。如果API服务器正在进行本地令牌验证,他们将能够免费使用它,直到到期。请查看关于处理被盗令牌威胁的部分。简言之,他们建议将代币存储在私有内存/受保护的存储中,并保持它们的短寿命。好的-完成了-感谢有趣的讨论。