我一直在尝试使用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>
对此方面的任何指南,教程或更正表示赞赏。
答案 0 :(得分:1)
Ember Simple Auth的最新版本放弃了定义初始化程序的需求,并为库添加了Ember CLI Addons,这使得设置所有内容变得更加容易。此外,README和API文档现在专注于使用带有Ember CLI的库,它可以为您提供很多帮助。
答案 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应用程序中。