【问题标题】:Why does spring-social's ConnectController start the OAuth 2 "dance" with a POST?为什么 spring-social 的 ConnectController 会通过 POST 启动 OAuth 2“跳舞”?
【发布时间】:2016-05-14 19:56:02
【问题描述】:

我正在尝试使用 spring-social 制作一个通过 OAuth2 连接到 Fitbit 的应用。 I've had some troubles with this 但我想我正在解决问题。我注意到 OAuth 过程是通过对 ConnectController 进行 POST 来启动的。为什么这是通过 POST 而不是 GET 来完成的?我想这样做,以便我可以将链接放入聊天室,用户可以单击该链接以授权我的应用程序使用他们的 Fitbit 信息,这意味着我想从 GET 开始。有没有理由不这样做?如果我要对此效果进行更改(通过子类化 ConnectController)我会遇到技术/安全问题吗?

【问题讨论】:

    标签: java spring oauth oauth-2.0 spring-social


    【解决方案1】:

    有两个原因:

    1. 主要原因是 GET 请求应该执行既安全又具有幂等性的操作。但是作为该请求的结果,您可能(在 OAuth 1.0(a) 的情况下)最终获得并可能存储请求令牌以及与提供者一起初始化 OAuth 舞蹈。就安全请求而言,这不被认为是“安全的”。此外,它可能是幂等的,也可能不是幂等的,因为重复请求可能会导致不同的行为(取决于提供者对 OAuth 的实现)。虽然这可能不适用于 OAuth 2,但它需要在 OAuth 1 和 OAuth 2 之间保持一致。
    2. /connect/{provider} 路径代表单个资源。只有这么多的 HTTP 动词可供选择,而无需将动词放入路径中。该路径的 GET 方法已分配给请求以获取该提供程序的连接状态(一个安全且幂等的操作)。

    即便如此,我还是遇到了您所询问的用例。当我觉得需要一个启动 OAuth 流程的链接时,我所做的是拥有一个 POST 到 /connect/{provider} 的表单,并有一些 Javascript 为我提交表单,或者作为结果直接链接(如果链接在应用程序的页面上)或作为页面加载的结果(如果要在电子邮件或聊天室中提供链接)。

    当然也欢迎您重写 ConnectController 的行为,甚至编写您自己的控制器实现来满足您的需求,即使它们违反了 ConnectController 以这种方式实现的原因。

    【讨论】:

    • 感谢您的回答!这些正是我正在寻找的细节。我还看到 POST a form 技术推荐了几个地方。一个后续问题 RE#2:/connect/{provider} 是否对 OAuth2 舞蹈至关重要? IE。杀死/更改它会导致 ConnectController 无法完成 OAuth 方面的工作吗?
    • 我正在玩 Spring Social 以通过 Facebook 提供商进行连接,但我想知道在点击 /connect 时使用 POST 的有效负载是什么。我们必须发送请求的正文?
    猜你喜欢
    • 2016-05-13
    • 2013-11-02
    • 2013-06-13
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2011-12-19
    • 2014-03-04
    • 2014-07-04
    相关资源
    最近更新 更多