使用ember-cli和ember-simple-auth设置客户端凭据OAuth2

时间:2014-06-25 13:25:10

标签: ember.js oauth-2.0 ember-cli

我一直在尝试使用ember-cli和Rails API后端设置OAuth2客户端凭据流,并且已经达到了死胡同。也许是因为我不熟悉。我目前正在尝试做的是:

bower.json
{
    "ember-simple-auth": "*"
}

Brocfile.js
app.import('vendor/ember-simple-auth/simple-auth.amd.js')
app.import('vendor/ember-simple-auth/simple-auth-oauth2.amd.js')

initializers/login.js
App.initializer({
  name: 'Register Components',
  initialize: function(container, application) {
    registerComponents(container);
    Ember.SimpleAuth.setup(application);
  }
});

controllers/login.js
import LoginControllerMixin from 'simple-auth/mixins/login-controller-mixin';

export default Ember.Controller.extend(SimpleAuth.LoginControllerMixin, {
  authenticatorFactory: 'simple-auth-authenticator:oauth2-password-grant'
});

templates/login.hbs
<form {{action authenticate on='submit'}}>
  <label for="identification">Login</label>
  {{view Ember.TextField id='identification' valueBinding='identification' placeholder='Enter Login'}}
  <label for="password">Password</label>
  {{view Ember.TextField id='password' type='password' valueBinding='password' placeholder='Enter Password'}}
  <button type="submit">Login</button>
</form>

对此方面的任何指南,教程或更正表示赞赏。

4 个答案:

答案 0 :(得分:1)

Ember Simple Auth的最新版本放弃了定义初始化程序的需求,并为库添加了Ember CLI Addons,这使得设置所有内容变得更加容易。此外,README和API文档现在专注于使用带有Ember CLI的库,它可以为您提供很多帮助。

查看自述文件:https://github.com/simplabs/ember-simple-auth#readme

答案 1 :(得分:1)

我最近discussed this on GitHub。这就是我最终使用HTTP基本身份验证(在app / app.js中)对客户端进行身份验证的过程:

import OAuth2Authenticator from 'simple-auth-oauth2/authenticators/oauth2';

OAuth2Authenticator.reopen({
  makeRequest: function(data) {
    var clientId = MyProjectENV.APP.apiClientId;
    var clientSecret = MyProjectENV.APP.apiClientSecret;
    return Ember.$.ajax({
      url:         this.serverTokenEndpoint,
      type:        'POST',
      data:        data,
      dataType:    'json',
      contentType: 'application/x-www-form-urlencoded',
      headers:     { "Authorization": "Basic " + btoa(clientId + ":" + clientSecret) }
    });
  }
});

并在config / environment.js中:

var ENV = {
  // ...
  APP: {
    apiClientId: "12345",
    apiClientSecret: "abcdefg987654"
  }

答案 2 :(得分:0)

您可以通过设置OAuth 2.0身份验证器的clientId属性来包含客户端ID(请参阅API文档:http://www.mynewsite.com/new-subfolder1/new-subfolder2/page.php)。与其他答案所暗示的相反你永远不应该包含客户秘密。只要您在Ember应用程序中的任何地方使用秘密,它就不再是秘密,因为它包含在源中,并且对于每个有权访问源的人都可见(通常是整个互联网上的所有人)。

Web客户端是OAuth方面的公共客户端,无法信任,因此无法使用客户端密钥。您可以使用客户端ID进行分析等,但您甚至不应该相信服务器端,因为它可以很容易地被操作,当然也可以被其他客户端使用,因为它可以从应用程序源中查找。

所以请大家记住:

永远不要在Ember应用程序中使用客户端秘密!!! 1!1!

答案 3 :(得分:-1)

感谢marcoow的巨大努力Ember-Simple-Auth支持一种简单的方法来添加client_it吧!

ESA在默认身份验证器中将clientId的值设置为null(请参阅文件 node_modules / e-s-a / addon / authenticator / oauth2-password-grant.js

您可以覆盖自定义身份验证器中的值,方法与覆盖自定义服务器令牌端点的方式相同。

// app/authenticators/oauth2.js
import OAuth2PasswordGrant from 'ember-simple-auth/authenticators/oauth2-password-grant';
import ENV from '../config/environment';

export default OAuth2PasswordGrant.extend({
  serverTokenEndpoint: `${ENV.api.host}/oauth/token`,
  clientId: `${ENV.APP.apiClientId}`,
});

您可以考虑作者关于在github discussion上设置client_id的意见。

<强>更新

我更新了源代码并删除了客户端密码,因为您不应该将其包含在ember应用程序中。