java - 为什么 spring-social 的 ConnectController 用 POST 启动 OAuth 2 "dance"?

标签 java spring oauth oauth-2.0 spring-social

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

最佳答案

有两个原因:

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

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

当然也欢迎您重写 ConnectController 的行为,甚至编写自己的 Controller 实现来满足您的需求,即使它们违反了 ConnectController 实现方式背后的推理。

关于java - 为什么 spring-social 的 ConnectController 用 POST 启动 OAuth 2 "dance"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35213991/

相关文章:

java - 获取 jar 内文件夹内的检索文件

java - 显示概览的滚动 Pane /视口(viewport) Swing 组件

java - spring 单例作用域——每个容器每个 bean

java - spring多个@transactional数据源

ruby-on-rails - 跨应用程序/服务器的 Rails 身份验证

iphone - 用于 iPhone 开发的 Twitter-oAuth-library

java - spring中@component的xml配置表示是什么

java - Java 线程的未知行为

Spring Security 2.0 Facebook 连接

google-apps-script - 如何启用 OAuth Google 脚本,而无需每次 token 过期时都登录?