我正在尝试使用Rails后端设计Ember应用程序的身份验证流程。我基本上想通过Google / Facebook /等对用户进行身份验证,我不想提供“独立”的身份验证服务。我确实希望在服务器端维护一个用户列表,可能会将来自不同源的不同身份验证合并到同一个用户中。我不会从客户端代表Google / Facebook上的用户进行互动,但我会在服务器端进行此操作。
由于上述原因,我计划做以下事情:
我将使用torii在客户端获取auth_token,然后将其传递到服务器端,我将在其中验证它,将其转换为访问令牌。
我将在服务器端生成一个自定义令牌,我将发送回客户端并要求所有进一步的API调用都附带该令牌。我根本不会与客户共享访问令牌。
你会说这是最佳流程吗?
在实施方面,我已经能够使用示例here从不同的提供商处获取auth_tokens。但我完全不确定:
如何将身份验证令牌传递给服务器端?使用下面的代码,我可以获得身份验证令牌,但这是实现API调用的适当位置吗?
export default Ember.Route.extend({
actions: {
googleLogin: function() {
var _this = this;
this.get('session').authenticate('simple-auth-authenticator:torii', 'google-oauth2').then(
function() {console.log(_this.get('session.secure.authorizationCode'));}
);
return;
},
facebookLogin: function() {
this.get('session').authenticate('simple-auth-authenticator:torii', 'facebook-oauth2');
return;
}
}
});
如何对API的所有进一步请求附带特定令牌?
答案 0 :(得分:1)
我已经实现了完全相同的工作流程。 我使用ember-simple-auth和ember-simple-auth-torii并实现了一个自定义验证器来实现这个目标。
Ember-simple-auth提供了自定义身份验证器here的示例。
您的自定义身份验证器实现将如下所示
您的自定义身份验证器中的身份验证回调基本上如下所示:
authenticate: function(provider, options) {
var self = this;
return new Ember.RSVP.Promise(function(resolve, reject) {
self.torii.open(provider, options || {}).then(function(data) {
var endpoint = '/token'; // Your API endpoint used to get your cutom token
var dataToSend = { // Data sent to your endpoint
grant_type: 'authorization_code',
code: data.accessToken,
access_token: data.accessToken
};
$.post(endpoint, dataToSend).done(function(response) {
response.provider = provider;
resolve(data);
}).fail(function(response) {
response.provider = provider;
reject(data);
})
}, reject)
})
}
一旦您启动了自定义身份验证器,您就可以在控制器上使用它:
this.get('session').authenticate(
'authenticator:customauthenticator', // Or wathever name you gave
'facebook-connect' // Any compatible torii provider
).then(function(user) {
console.log(user); // Will display ajax response from your endpoint
})
最后,如果您希望自动发送包含所有ajax请求的自定义令牌,则可以使用ember-simple-auth oauth2-bearer授权程序。