我希望能够根据URL中的确认令牌参数自动登录用户。在我的路由中,我向服务器发出一个AJAX请求,以验证令牌并发送回用于登录的相同序列化Oauth2 JSON。
是否可以使用此令牌登录用户?
首先,用户转到以下网址:
http://example.com/users/confirmation?confirmation_token=eisz6LMzmck55xHuqopF
接下来,我的路由向服务器发送一个AJAX请求,该服务器使用Oauth2令牌进行回复。
这是我当前的实现尝试使用身份验证器来恢复它。尽管在控制台中看到“我应该登录”,但它无法正常工作。我怀疑这是因为它不知道恢复会话。查看session documentatio n,我看到了一个手动验证的公共方法,但没有从oauth令牌恢复的方法。
import Ember from 'ember';
import ajax from 'ic-ajax';
export default Ember.Route.extend({
model: function(params) {
var path = MyApp.API_NAMESPACE + '/confirmation?confirmation_token=' + params.confirmation_token;
var authenticator = this.container.lookup('simple-auth-authenticator:oauth2-password-grant');
return ajax(path).then(function(response) {
return authenticator.restore(response).then(function() {
console.log('I should be logged in');
});
}).catch(function(request) {
console.log(request);
});
}
});
答案 0 :(得分:0)
我通过创建一个基本上继承自oauth2身份验证器的自定义身份验证器来解决这个问题,只覆盖authenticate
方法。
首先我在app/lib/confirmation-authenticator.js
中创建了我的身份验证器:
import OAuth2Authenticator from 'simple-auth-oauth2/authenticators/oauth2';
import ajax from 'ic-ajax';
export default OAuth2Authenticator.extend({
authenticate: function(token) {
var path = MyApp.API_NAMESPACE + '/confirmation?confirmation_token=' + token;
return new Ember.RSVP.Promise(function(resolve, reject) {
ajax(path).then(function(response) {
resolve(response);
}).catch(function(request) {
reject(request.textStatus);
});
});
}
});
然后在app/initializers/authentication
:
import ConfirmationAuthenticator from 'my-app/lib/confirmation-authenticator';
export default {
name: 'authentication',
before: 'simple-auth',
initialize: function(container) {
container.register('simple-auth-authenticator:confirmation', ConfirmationAuthenticator);
window.ENV = window.ENV || {};
window.ENV['simple-auth'] = {
authorizer: 'simple-auth-authorizer:oauth2-bearer',
};
window.ENV['simple-auth-oauth2'] = {
serverTokenEndpoint: MyApp.API_NAMESPACE + '/oauth/token'
};
}
};
最后我的路线在app/routes/users/confirmation.js
:
import Ember from 'ember';
export default Ember.Route.extend({
model: function(params) {
var token = params.confirmation_token;
return this.get('session').authenticate('simple-auth-authenticator:confirmation', token);
}
});