Authentication ember简单身份验证会话、ember数据和传递授权标头

Authentication ember简单身份验证会话、ember数据和传递授权标头,authentication,ember.js,ember-data,ember-simple-auth,Authentication,Ember.js,Ember Data,Ember Simple Auth,我有一个正在运行的oauth2身份验证过程,在这个过程中,我使用ember simple auth获取一个访问令牌(如来自facebook),将其发送到后端,后端调用fb.me(),然后使用JWT创建令牌。然后将该令牌发送回ember应用程序,该应用程序随后必须将其与每个服务器请求一起发送,包括ember data发出的请求 我还需要在重新加载浏览器后使用此令牌 我尝试了许多选项,在会话上设置了属性“authToken”-我相信这会使用本地存储来持久化经过身份验证的会话 但是我似乎总是在协调这个

我有一个正在运行的oauth2身份验证过程,在这个过程中,我使用ember simple auth获取一个访问令牌(如来自facebook),将其发送到后端,后端调用fb.me(),然后使用JWT创建令牌。然后将该令牌发送回ember应用程序,该应用程序随后必须将其与每个服务器请求一起发送,包括ember data发出的请求

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

我尝试了许多选项,在会话上设置了属性“authToken”-我相信这会使用本地存储来持久化经过身份验证的会话

但是我似乎总是在协调这个令牌的检索时遇到问题——要么我没有访问会话的权限,要么令牌不再在会话上,要么我无法更改余烬数据头

有没有人能举一个简单的例子来说明如何做到这一点?我认为这应该很容易,但我显然遗漏了一些东西

谢谢

更新

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

   authenticateWithGooglePlus: function () {
      var self = this;
      this.get('session').authenticate('simple-auth-authenticator:torii', 'google-oauth2')
        .then(function () {
          resolveCodeToToken(self.get('session'), self);
        });
    }
ResolveCodeToToToken从服务器获取承载令牌,在会话上设置它,然后转换到受保护页面:

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);
     }
  }
});

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

您希望实现自己的,首先从Facebook获取令牌,然后将其发送到您自己的服务器,以便为您的应用程序交换令牌。一旦你有了它,你就可以免费获得余烬数据请求的授权以及会话持久性等


看看这个例子:

感谢您的回答-我想我可以使用Tori验证器(我已经完成了所有这些),而不是实现自定义验证器。不过没关系,我可以使用你代码中的自定义代码。但是,“授权”令牌如何与所有后续ajax请求一起传递?我现在有同样的问题-授权头没有设置。。。谢谢这里我说的“授权”令牌我真的是指“授权”头(这是我的服务器返回的承载令牌,我的服务器在每个请求到受保护的url时检查的令牌)啊,这是由自定义授权人完成的吗?天哪,我现在可以用了。我实现了一个自定义授权程序,并使用我在会话中放置的令牌设置了头。剩下的最后一个问题是,即使我使用的是本地存储(只是默认设置),会话内容也无法通过浏览器重新加载。不知道那里发生了什么。那么,是不是因为没有办法连接到我的服务器将accessToken转换为承载令牌,所以我不能使用Tori?我不确定这个用例到底是什么?