【问题标题】:Oauth2 plain text credentials in POST request?POST请求中的Oauth2纯文本凭据?
【发布时间】:2019-03-25 22:29:20
【问题描述】:

所以我在 Spring Boot 2 中尝试使用 OAuth2 的 Spring Security。

我以此网站为参考:
https://dzone.com/articles/secure-spring-rest-with-spring-security-and-oauth2

设置授权服务器后,可以使用http://localhost:8080/oauth/token 端点通过传递 POST 请求从中获取令牌。

让我胆怯的是 POST 请求必须以纯文本形式包含我的用户名和密码

POST /oauth/token HTTP/1.1
Host: localhost:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="grant_type"

password
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="username"

admin
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="password"

password
------WebKitFormBoundary7MA4YWxkTrZu0gW--

这不是一个非常大的安全威胁吗? 从客户端到服务器的每一个路由器都不能看到 POST 正文的内容吗?

现在要解决这个问题,假设我在 javascript 中使用客户端对称加密算法来加密密码。由于所有客户端都将获得相同的加密算法,因此沿途的路由器可以对称地解码我的密码。这还不够好。

如果我必须将凭据作为纯文本传递,那么 Spring Security 有什么用? 我在这里做错什么了吗?大公司没有办法使用它。 Spring Security 中是否有任何额外的工具可以让我们防止这种情况发生?

【问题讨论】:

  • 客户端、资源服务器和授权服务器之间的所有通信都应该使用 SSL 证书进行加密,这不是 Spring Security 管理的。 Spring Security 工作在应用层而不是 HTTP 传输层。
  • @chirdeep ,感谢您的关注。但是 Spring security Oauth2 使用 HTTP 而不是 HTTPS 工作,因此在考虑这种实现时造成了障碍。
  • @SamwellTarly:要使 Spring Security OAuth2 授权服务器安全,您必须更改服务器配置。例如在 Spring Boot 中嵌入 Tomcat 的配置。

标签: spring-boot spring-security oauth-2.0 spring-security-oauth2


【解决方案1】:

您必须使用 HTTPS (TLS),请参阅 The OAuth 2.0 Authorization Framework

令牌端点

[...]
由于对令牌端点的请求导致传输 明文凭据(在 HTTP 请求和响应中), 授权服务器必须要求使用 TLS,如 向令牌端点发送请求时的第 1.6 节。

如果您的授权服务器实现允许不安全的通信,则它不符合 OAuth2 规范。

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 2021-12-16
    • 1970-01-01
    • 2019-11-09
    • 1970-01-01
    • 2012-04-04
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多