在 Oauth2 令牌请求 URL 中隐藏密码

Posted

技术标签:

【中文标题】在 Oauth2 令牌请求 URL 中隐藏密码【英文标题】:Hide password in Oauth2 token request URL 【发布时间】:2015-02-20 16:53:39 【问题描述】:

我们正在使用 java、jersey 和 spring-security 构建一个 RESTful Web 应用程序。 设置了用于保护对 REST 资源的访问的 OAuth2 提供程序服务。

要请求有效的刷新令牌令牌,必须提供以下查询参数:

用户名 密码 client_id grant_type

用户名/密码由前端的登录对话框提供:

但是当我检查应用程序的网络流量时,我看到以下 URL 经过,其中密码以明文形式显示:

在将请求 URL 发送到 OAuth2 提供程序时,是否有一种简单的方法可以隐藏请求 URL 中的密码? 是否可以通过 spring-security 配置来实现这一点?

这是我的授权服务器的 spring-security 配置:

<!-- Token management -->
<oauth:authorization-server client-details-service-ref="clientDetails" token-services-ref="tokenServices" user-approval-handler-ref="userApprovalHandler" token-endpoint-url="/oauth/token">
    <oauth:authorization-code/>
    <oauth:implicit/>
    <oauth:refresh-token/>
    <oauth:client-credentials/>
    <oauth:password/>
</oauth:authorization-server>

【问题讨论】:

查看***.com/questions/4196545/… @javadev 这不是我要找的。我想在 oauth2 url 中隐藏密码,而不是在 spring 配置中隐藏密码... 【参考方案1】:

首先,您需要使用 HTTPS 端点。安全版本在发送任何数据之前执行握手。一旦建立安全连接,所有查询参数都会被加密。希望这是有道理的。

Security Namespace Configuration 的文档。 3.3.2 添加 HTTP/HTTPS 通道安全性部分将帮助您实现这一点。

这也很有帮助Here

【讨论】:

感谢您的回复。目标是使我们的端点成为 HTTPS 端点。很高兴知道安全连接将加密所有查询参数。这将解决我的问题。我也在想:有没有办法在标题中传递用户名/密码,而不是作为查询参数? @MathiasGhys,一旦您与服务器建立安全连接,您就可以使用基本身份验证 (BA)。在 BA 中,数据是 Base 64 编码的,但所有内容都将再次加密。所以这会解决你的问题。【参考方案2】:

@KhushalDave 感谢您的回复。

我使用以下教程在本地 Tomcat 应用服务器的端口 8443 上创建了一个自签名密钥库并启用了 SSL 身份验证:Tomcat SSL configurationhttp://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html

接下来,我使用 requires-channel="https" 属性保护了对 /oauth/token url 的每次调用,表明在我的 spring-security.xml 中需要 https 通道:

    <sec:intercept-url pattern="/oauth/token" access="IS_AUTHENTICATED_FULLY" requires-channel="https" />

现在,当我在本地服务器上调用我的 /oauth/token url 时,调用是使用 SSL 保护的。

当我在浏览器(谷歌浏览器)中检查网络流量时,我仍然可以清楚地看到密码。

我想这还不错,因为它只是记录在浏览器地址栏中输入的数据...只要查询参数在网络级别受到保护,我想就可以了。

也许我应该使用Eavesdrop 或Wireshark 之类的程序来验证密码在网络级别是否受到保护。

【讨论】:

我知道这与您的问题所述略有不同。纠正我如果我错了,但 OAuth 2 规范允许将此类凭据作为表单参数发送。至少这就是FOSOAuthServerBundle (php) 概述中使用的实现。这将从 URL 和潜在的日志文件中隐藏此信息。 对不起,我有一段时间没有看到这个你是绝对正确的。 URL 将被加密,参数将不可见。

以上是关于在 Oauth2 令牌请求 URL 中隐藏密码的主要内容,如果未能解决你的问题,请参考以下文章

在 package.json 中隐藏私有仓库的令牌

无法在 Spring Oauth2 密码授予中获取访问令牌

OAuth 2.0

OAuth 2.0

OAuth 2.0

仅在 JWT 令牌中而不是在 OAuth2 令牌中添加附加信息