jhipster oauth2客户端秘密

时间:2015-08-16 19:10:50

标签: oauth-2.0 jhipster

我一直在尝试使用jhipster。 我已将我的应用配置为使用oauth2。 为此,我在application.yml

中有一个客户机密

根据我在这个主题上发现的几篇文章,客户秘密应该始终保密。例如,选中https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified

  

客户机密必须保密。如果部署的应用程序无法保密,例如Javascript或本机应用程序,则不使用该秘密。

我注意到生成的auth.oauth2.service.js包含纯文本的秘密:

        return {
            login: function(credentials) {
                var data = "username=" + credentials.username + "&password="
                    + credentials.password + "&grant_type=password&scope=read%20write&" +
                    "client_secret=mySecretOAuthSecret&client_id=myapp";
                return $http.post('oauth/token', data, {
                    headers: {
                        "Content-Type": "application/x-www-form-urlencoded",
                        "Accept": "application/json",
                        "Authorization": "Basic " + Base64.encode("myapp" + ':' + "mySecretOAuthSecret")
                    }
                }).success(function (response) {
                    var expiredAt = new Date();
                    expiredAt.setSeconds(expiredAt.getSeconds() + response.expires_in);
                    response.expires_at = expiredAt.getTime();
                    localStorageService.set('token', response);
                    return response;
                });
            },

我知道在缩小的javascript中找到它会有点困难,但是任何寻找'client_secret'的人都会很快获得奖励。

我错过了什么吗?或者jHipster oauth实施是否不安全?

谢谢, 安迪

1 个答案:

答案 0 :(得分:9)

由于像jhipster这样的JS客户端无法保密客户机密“秘密”,因此根本不使用客户机秘密。 jhipster使用的OAuth2资源所有者密码凭据授权流程适用于非常受信任的客户端 - jhipster的客户端。它允许您跳过正常的“授权”端点并直接转到“令牌”端点,以使用您的用户凭据获取令牌。如果您的Spring授权服务器(AS)定义了客户端密钥,则需要从客户端JS传递该秘密。但是,如果您从AS中的内存客户端设置中删除了秘密定义(例如,在OAuth2ServerConfiguration.java中注释掉该行),则可以在JS中将其完全删除(参见下文)

return {
   login: function(credentials) {
      var data = "username=" + credentials.username + "&password=" + credentials.password + "&grant_type=password&scope=read%20write&";
      return $http.post('oauth/token', data, {
         headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "application/json",
            "Authorization": "Basic " + Base64.encode("myapp" + ':' + "")
         }
      }).success(function (response) {
         var expiredAt = new Date();
         expiredAt.setSeconds(expiredAt.getSeconds() + response.expires_in);
         response.expires_at = expiredAt.getTime();
         localStorageService.set('token', response);
         return response;
      });
   },

删除您的客户端密码后,我认为您的应用程序确实更安全但感觉更清洁和诚实 - 因为您承认使用仅限JS的客户端,您只能如此安全。对于JS和本机客户端,通常使用隐式流,并且它不会烦扰客户机密钥。它从更强大的授权代码授权流程中简化,因为JS或本机客户端无法保密。

无论如何,jhipster可能不应该在JS源代码中拥有客户端秘密,但我不相信它会造成任何伤害(因为唯一的选择是拥有一个空白的客户端秘密,这不是更安全) 。你不是不安全的(因为规范允许这样的事情)但你使用授权代码流更安全(这需要在jhipster实现中做一些工作)或者让轻型服务器代理添加客户端 - 对“令牌”端点的请求是秘密而不是直接来自JS。服务器到服务器的通信(例如,通过代理)使秘密远离浏览器的视图。

请参阅这篇文章,以便讨论使用oauth2的仅限JS的客户端的陷阱:http://alexbilbie.com/2014/11/oauth-and-javascript/

这是一个使用oauth2和angularjs并在代理上使用spring的示例:https://spring.io/blog/2015/02/03/sso-with-oauth2-angular-js-and-spring-security-part-v