使用Oauth服务器/客户端进行Ember身份验证

时间:2015-08-22 19:17:42

标签: authentication model-view-controller ember.js oauth

我正在尝试使用Rails后端设计Ember应用程序的身份验证流程。我基本上想通过Google / Facebook /等对用户进行身份验证,我不想提供“独立”的身份验证服务。我确实希望在服务器端维护一个用户列表,可能会将来自不同源的不同身份验证合并到同一个用户中。我不会从客户端代表Google / Facebook上的用户进行互动,但我会在服务器端进行此操作。

由于上述原因,我计划做以下事情:

  1. 我将使用torii在客户端获取auth_token,然后将其传递到服务器端,我将在其中验证它,将其转换为访问令牌。

  2. 我将在服务器端生成一个自定义令牌,我将发送回客户端并要求所有进一步的API调用都附带该令牌。我根本不会与客户共享访问令牌。

  3. 你会说这是最佳流程吗?

    在实施方面,我已经能够使用示例here从不同的提供商处获取auth_tokens。但我完全不确定:

    • 如果我需要ember-simple-auth或者只有torii(这两者如何相互补充?)
    • 如何将身份验证令牌传递给服务器端?使用下面的代码,我可以获得身份验证令牌,但这是实现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的所有进一步请求附带特定令牌?

    • 我应该在服务器端使用设计,以使其更容易吗?

1 个答案:

答案 0 :(得分:1)

我已经实现了完全相同的工作流程。 我使用ember-simple-auth和ember-simple-auth-torii并实现了一个自定义验证器来实现这个目标。

Ember-simple-auth提供了自定义身份验证器here的示例。

您的自定义身份验证器实现将如下所示

  • 首先使用torii获取auth_token
  • 然后针对您的后端验证此auth_token以获取您的自定义令牌

您的自定义身份验证器中的身份验证回调基本上如下所示:

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授权程序。