我已经为用户设置了注册后的自动身份验证:
app/libs/auto-authenticate.js
export default Ember.SimpleAuth.Authenticators.OAuth2.extend({
authenticate: function(credentials) {
if(!Ember.isEmpty(credentials.access_token)) {
return Ember.RSVP.resolve(credentials);
} else {
return this._super(credentials);
}
}
});
应用/应用.js
import AutoAuthenticate from 'appkit/libs/auto-authenticate';
App.initializer({
name: 'auto',
initialize: function(container, application) {
container.register('app:authenticators:custom', AutoAuthenticator);
Ember.SimpleAuth.setup(container, application);
}
});
应用/控制器/注册.js
export default Ember.ObjectController.extend({
firstname: '',
lastname: '',
username: '',
password: '',
actions: {
registerUser: function(){
var self = this;
var user = this.store.createRecord('user', {
first_name: this.get('firstname'),
last_name: this.get('lastname'),
username: this.get('username')
});
user.set('typedPass', this.get('password'));
user.save().then(function(){
//How can I login this user using ember-simple-auth ??
});
}
}
});
我为用户提供了单独的登录名,该登录名将提供其用户名和密码。
我想做的是,当新用户在网站上注册时,我希望该用户直接登录而无需转到登录页面并提供其用户名/密码?由于我从注册过程中获取用户名和密码,因此我不希望用户转到另一条路由然后登录。如何调用自定义身份验证器以使用其登录凭据对当前注册的用户进行身份验证?
最好的解决方案可能是重用注册控制器中已有的用户名和密码属性:
export default Ember.ObjectController.extend({
firstname: '',
lastname: '',
username: '',
password: '',
actions: {
registerUser: function(){
var self = this;
var user = this.store.createRecord('user', {
first_name: this.get('firstname'),
last_name: this.get('lastname'),
username: this.get('username')
});
user.set('typedPass', this.get('password'));
user.save().then(function() {
//this is basically what happens when you trigger the LoginControllerMixin's "authenticate" action
this.get('session').authenticate('app:authenticators:custom', {
identification: this.get('username'),
password: this.get('password')
});
});
}
}
});
我们使用设计并遇到了同样的问题。我对这个解决方案并不完全满意,但我们在对user.save()
的响应中返回了 devise auth 令牌,并直接调用session#setup
,如下所示:
user.save().then(function(user) {
var secure = self.session.get('secure');
secure.token = user.get('deviseAuthToken');
secure.email = user.get('email');
self.session.setup('simple-auth-authenticator:devise', secure, true);
}
使用新的 ember-simple-auth 1.0 插件,我们将此代码移动到自定义身份验证器中:
//app/authenticators/registration.js
import Ember from 'ember';
import DeviseAuthenticator from 'ember-simple-auth/authenticators/devise';
const { set } = Ember;
export default DeviseAuthenticator.extend({
authenticate: function(registration) {
const { tokenAttributeName, identificationAttributeName } = this.getProperties('tokenAttributeName', 'identificationAttributeName');
const data = {};
return registration.save().then(function(response) {
set(data, tokenAttributeName, response.get('authToken'));
set(data, identificationAttributeName, response.get('email'));
set(data, 'registration', response.toJSON());
return data;
});
}
});
并在我们注册表的提交操作中触发此身份验证器:
//app/controllers/registration.js
export default Ember.Controller.extend({
session: Ember.inject.service('session'),
actions: {
submit: function() {
this.get('session')
.authenticate('authenticator:registration', this.get('model'));
}
}
}
我们的注册表单绑定到一个注册模型对象,如下所示:
//app/models/registration.js
export default DS.Model.extend(SiteModelMixin, {
email : DS.attr("string"),
password : DS.attr("string"),
authToken : DS.attr("string")
});
> Marcoow的答案应该适用于大多数情况,但在我的情况下,注册响应包括完整的身份验证会话以及新创建用户的所有数据(即登录和注册响应是相同的)。在这种情况下,使用表单中的相同凭据执行登录请求有点不太理想,b/c有一个额外的网络请求(由于网络条件不稳定等原因可能会失败......
就我而言,响应包括身份验证令牌,因此我只需向我的自定义身份验证器提供一个对象,该对象检查接收数据中的authentication_token
,如果是,则假设数据是有效的用户会话(如果需要,可以对会话数据进行更严格的验证)并使用收到的数据解决承诺,从而导致用户会话在会话中使用 Ember Simple Auth 进行身份验证服务。
如果没有authentication_token,我会尝试使用身份验证器authenticate()
调用和解析的数据对象中的数据对象中的password
email
属性登录,并使用登录尝试的结果进行解析或拒绝。
我遇到了同样的问题,我无法从"这个"或"自己"获取会话/用户名/密码。 所以我所做的是:
App.session = this.get('session');
App.credentials = {
identification: data.username,
password: data.password
};
然后我在承诺中使用了它们(使用默认身份验证器):
user.save().then(function() {
App.session.authenticate('ember-simple-auth:authenticators:oauth2', App.credentials);
}, function(err) {
console.log('error ..')
});
我不想使用另一个网络请求,因为我的 API 返回带有注册响应的令牌,所以我开始沿着 Drew Nichols 的路线前进,但不喜欢创建单独的模型。最后我发现你可以简单地在适配器中扩展模型的handleResponse()
钩。然后,您只需要一个简单的身份验证器,它将返回输入数据(因此通过身份验证过程运行该数据以将其添加到会话中)。
这一切都在 Ember 2.7 中。
以下是User
型号的适配器:
// app/adapters/user.js
export default ApplicationAdapter.extend({
session: Ember.inject.service(),
handleResponse(status, headers, payload, requestData) {
if (this.isSuccess(status, headers, payload) && requestData.method === 'POST') {
this.get('session').authenticate('authenticator:registration', payload).catch((reason) => {
console.error( 'User Adapter Error:', reason );
});
}
this._super(...arguments);
},
});
以及上面调用的Registration
身份验证器:
// app/authenticators/registration.js
export default Base.extend({
authenticate(response) {
return new Ember.RSVP.Promise((resolve) => {
Ember.run.join(null, resolve, response);
});
},
});
然后要调用控制器(或任何地方),您可以简单地执行常规save()
:
this.get('model').save()