与 OAuth2 的深层链接因重定向而丢失

wuj*_*jek 2 oauth-2.0

我们有一个发送包含深层链接的电子邮件的应用程序,它使用 OAuth2。当用户已经“登录”(具有有效的访问令牌)时,深层链接工作正常,但当令牌过期/没有令牌等时,深层链接会中断。原因是应用程序收到具有特定深层 URL 的请求,向auth服务器发出请求,并带有指向自身的重定向URL(并且是主页,而不是原始请求中的深层链接,即我们曾经为应用程序配置的重定向URL),并且当登录顺利时,身份验证服务器执行重定向,应用程序显示主页,并且忘记了原始的深层链接请求。值得一提的是,所有这些都发生在单个浏览器窗口/选项卡中(要求不打开其他选项卡或使用弹出窗口)。

我有一个想法使用(滥用?)身份验证服务器需要在重定向中逐字使用“状态”请求参数,并且它将包含允许应用程序显示所需页面的信息(如应用程序内的链接) 。我不确定“state”参数是否应该这样使用,它似乎是为防止 CSRF 而设计的,而不是像这样的自定义逻辑。

另一个有效的选项是基于这样一个事实:服务器不将完整的重定向 URL 与配置的 URL 进行匹配,只检查它是否以配置的 URL 为前缀(因为 OAuth2 规范没有强制要求这样做,它说完整应该进行匹配)。因此,由于我们的重定向 URL 是深层链接,并且配置的 URL 是其前缀,因此它确实有效。然而,当服务器决定匹配完整的 URL 时,这种行为将会中断(并且它是用 Spring Security 编写的,并且很容易更改此行为,只需使用库中已提供的不同匹配器类即可:https://github .com/spring-projects/spring-security-oauth/blob/ec215f79f4f73f8bb5d4b8a3ff9abe15b3335866/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/provider/endpoint/ExactMatchRedirectResolver.java)。我想使用更安全的方式,即不与 OAuth2 对抗的方式。

有一个更好的方法吗?

aha*_*tho 5

在“state”参数的规范中,描述以文本开头:

客户端使用的不透明值来维护请求和回调之间的状态。

对我来说,这意味着它正是为了您所描述的目的而设计的。在我开发的一个应用程序中,我们传递了一个状态参数值,我们可以在回调响应中包含所有必要的状态。在编码为安全的查询参数值之前,我们的值看起来像这样: nonce=<nonce value>&location=<deep link>。当回调 URI 收到请求时,它将检索“state”参数的值,然后解析该值,验证随机数并重定向到该位置。