【问题标题】:Deep links with OAuth2 lost because of redirects与 OAuth2 的深层链接因重定向而丢失
【发布时间】:2017-07-21 00:44:17
【问题描述】:

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

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

另一个可行的选项是基于服务器不匹配完整重定向 URL 与配置的 URL 的事实,只需检查它是否以配置的 URL 为前缀(因为 OAuth2 规范没有强制要求,它说应该完成完全匹配)。因此,由于我们的重定向 URL 是深层链接,而配置的 URL 是其前缀,所以它确实有效。但是,当服务器决定匹配完整的 URL 时,此行为将中断(它是用 Spring Security 编写的,很容易更改此行为,只需使用已随 lib 提供的不同匹配器类: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 对抗的方式。

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: oauth-2.0


    【解决方案1】:

    In the specification为'state'参数,说明以文字开头:

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

    对我来说,这意味着它完全符合您描述的目的。在我处理过的应用程序中,我们为 state 参数传递了一个值,我们可以在回调响应中包含所有必要的状态。在编码为安全的查询参数值之前,我们的看起来像这样:nonce=<nonce value>&location=<deep link>。当回调 URI 收到请求时,它会检索 'state' 参数的值,然后对其进行解析,验证 nonce 并重定向到该位置。

    【讨论】:

    • 重新阅读规范,你是对的,它允许为此使用状态,并且应该用于 CSRF 预防。
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2018-04-11
    • 2013-08-12
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多