【发布时间】: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