【问题标题】:ember simple auth session, ember data, and passing a Authorization headerember 简单身份验证会话、ember 数据和传递授权标头
【发布时间】:2014-11-29 11:24:39
【问题描述】:

我有一个有效的 oauth2 身份验证过程,我使用 ember 简单身份验证获取访问令牌(例如,来自 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') 会未定义,我认为默认情况下会话会保留在本地存储中。它经过身份验证的事实是持久的,但是没有令牌就没有用,因为服务器将拒绝对受保护端点的调用。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答 - 我认为我可以使用 torii 验证器(我已经完成了所有工作)而不是实现自定义验证器。不过没关系,我可以在那里使用您的代码中的自定义代码。但是,所有后续 ajax 请求如何传递“授权”令牌?我现在有同样的问题 - 未设置授权标头...谢谢
    • 我所说的“'Authorization'令牌”我真正的意思是“'Authorization' HEADER”(这是我的服务器返回的不记名令牌和我的服务器在每次请求受保护的url时检查的令牌)
    • 啊,这是由自定义授权人完成的吗? github.com/simplabs/…
    • 天啊,我现在可以正常工作了。我按照文档实现了一个自定义授权方,并使用我在会话中放入的令牌设置了标头。最后剩下的问题是,即使我使用的是本地存储(只是默认值),会话内容在浏览器重新加载后也无法生存。不知道那里发生了什么。
    • 那么,是不是因为无法挂接调用我的服务器以将 accessToken 转换为不记名令牌而无法使用 torii 的情况?我不确定这个的用例到底是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多