ember简单的auth会话,ember数据和传递Authorization标头

时间:2014-11-29 11:24:39

标签: authentication ember.js ember-data ember-simple-auth

我有一个工作的oauth2身份验证过程,我使用ember simple auth获取访问令牌(例如来自facebook),将其发送到调用fb.me()的后端,然后使用JWT创建令牌。然后将此令牌发送回ember应用程序,然后必须随每个服务器请求发送它,包括由ember-data做出的请求。

我还需要在浏览器重新加载后使用此令牌。

我尝试了很多选项,我设置了一个属性' authToken'在会话上 - 我相信这会使用本地存储来保持经过身份验证的会话。

但我似乎总是在协调检索此令牌时遇到问题 - 要么我无法访问会话,要么令牌不再在会话中,或者我无法更改ember数据头。

有没有人有一个简单的例子说明如何做到这一点 - 我认为应该很容易,但我显然错过了一些东西!

感谢。

更新

我唯一能够工作的是使用torii,如下所示,但会话内容仍然在刷新时丢失 - 我可以看到它仍然经过身份验证,但它丢失了我在这里设置的令牌。所以我仍然在寻找一个真正的解决方案。

   authenticateWithGooglePlus: function () {
      var self = this;
      this.get('session').authenticate('simple-auth-authenticator:torii', 'google-oauth2')
        .then(function () {
          resolveCodeToToken(self.get('session'), self);
        });
    }

resolveCodeToToken从服务器获取承载令牌,在会话中设置它,然后转换到受保护的页面:

function resolveCodeToToken(session, route) {
  var authCode = session.content.authorizationCode;
  var type = session.content.provider.split('-')[0];
  $.ajax({
    url: 'http://localhost:4200/api/1/user/auth/' + type,
    data: {authCode: authCode}
  }).done(function (response) {
    // todo handle invalid cases - where user is denied access eg user is disabled
    session.set('authToken', response.token);
    route.transitionTo('activity', moment().format('DDMMYYYY'));
  });
}

我有一个自定义授权程序,用于在每个请求中放置令牌(存储在会话中):

import Base from 'simple-auth/authorizers/base';

export default Base.extend({
  authorize: function(jqXHR, requestOptions) {
    var accessToken = this.get('session.content.authToken');
     if (this.get('session.isAuthenticated') && !Ember.isEmpty(accessToken)) {
       jqXHR.setRequestHeader('Authorization', accessToken);
     }
  }
});

我不确定为什么this.get(' session.content.authToken')在刷新后未定义,我认为默认情况下会话持久存储在本地存储中。它经过身份验证的事实是持久化的,但如果没有令牌则没用,因为服务器将拒绝对受保护端点的调用。

1 个答案:

答案 0 :(得分:2)

您希望实现自己的custom authenticator,首先从Facebook获取令牌,然后将其发送到您自己的服务器,以便为您的应用交换令牌。完成后,您可以免费获得ember-data请求以及会话持久性等的授权。

看一下这个例子:https://github.com/simplabs/ember-simple-auth/blob/master/examples/7-multiple-external-providers.html