【问题标题】:Ember authentication with Oauth server/client使用 Oauth 服务器/客户端进行 Ember 身份验证
【发布时间】:2015-08-22 19:17:41
【问题描述】:

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

出于上述原因,我计划执行以下操作:

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

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

你会说这是一个最优流程吗?

在实现方面,我已经能够使用示例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 发出所有进一步请求以附上特定令牌?

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

【问题讨论】:

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


    【解决方案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 授权方。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2013-06-18
    相关资源
    最近更新 更多