客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?

Posted

技术标签:

【中文标题】客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?【英文标题】:Should clients get OAuth 2 access tokens using GET or POST?客户端是否应该使用 GET 或 POST 获取 OAuth 2 访问令牌? 【发布时间】:2012-01-06 16:06:25 【问题描述】:

OAuth 2.0 草案 v2-22 第 3.2 节说:

客户端在制作访问令牌时必须使用 HTTP“POST”方法 请求。

但是,如果您查看 Facebook 和 Foursquare OAuth2 实现,它们会要求客户端发出简单的 GET 请求来请求访问令牌。他们要求客户端将 client_id 和 client_secret 放在 URL 中。

我正在构建一个 OAuth 2 服务器,在看到 Facebook 和 Foursquare 的实现之后,我强烈考虑打破协议以允许客户端通过 GET 请求访问令牌。我网站的通信使用 SSL,类似于 Facebook 和 Foursquare。

所以我的问题是:有什么好的理由不让客户端通过 HTTPS 上的 GET 方法请求访问令牌?

【问题讨论】:

【参考方案1】:

最常见的论点是您不应该将敏感信息放在查询字符串(GET 参数)中,因为 Web 服务器通常会记录 HTTP 请求 URL。 POST 数据可以任意长,因此通常不记录。因此,当您处理诸如 client_secret 或代码之类的东西(尽管它是一次性使用)时,将其传递到 POST 有效负载中是有意义的。

恕我直言,如果您使用的是不需要 client_secret 的 OAuth 2.0 流程(或者您按照建议将其放在 HTTP 授权标头中)- 我认为允许 GET 没有问题。

【讨论】:

关于服务器日志的好点,但是对于 Oauth2,我们无论如何将 client_id 和 client_key 以明文形式存储在我们的服务器上,所以如果这些信息在我们的服务器日志中,这真的比它已经糟糕得多存在于我们的数据库中? 同意——那时差不多。如果 Web 服务器和您的 OAuth AS 都在您的控制之下 - 允许 GET IMHO 没什么大不了的。

以上是关于客户端是不是应该使用 GET 或 POST 获取 OAuth 2 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在搜索表单中发布或获取?

Chrome DevTools 是不是显示在给定的 GET 或 POST 请求中使用了啥证书

jersey之get,put,post,delete简单使用

什么时候应该使用 GET 或 POST 方法?他们之间有什么区别?

在 Django 中使用 Ajax Get/Post 方法

在 Django 中获取 POST 值