Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 如何在ember简单身份验证会话中从响应头更新JWT令牌_Ember.js_Ember Simple Auth - Fatal编程技术网

Ember.js 如何在ember简单身份验证会话中从响应头更新JWT令牌

Ember.js 如何在ember简单身份验证会话中从响应头更新JWT令牌,ember.js,ember-simple-auth,Ember.js,Ember Simple Auth,我正在使用ember简单身份验证&ember简单身份验证令牌在ember上维护会话。我不想使用刷新令牌方法,而是希望从每个服务请求的响应头中接收一个新的jwt令牌 每次收到服务器的响应时,如何通过更新会话中的jwt令牌来保持会话的活动性 这可以完成,但需要扩展ember简单身份验证和ember简单身份验证令牌。不建议使用您的方法,访问令牌加刷新令牌绝对是首选方法。它还可以更好地扩展,因为您的资源服务器不需要身份验证,只需要授权和验证令牌。它还增加了为每个请求生成新令牌的开销。虽然我不推荐这门课程

我正在使用ember简单身份验证&ember简单身份验证令牌在ember上维护会话。我不想使用刷新令牌方法,而是希望从每个服务请求的响应头中接收一个新的jwt令牌


每次收到服务器的响应时,如何通过更新会话中的jwt令牌来保持会话的活动性

这可以完成,但需要扩展
ember简单身份验证
ember简单身份验证令牌
。不建议使用您的方法,访问令牌加刷新令牌绝对是首选方法。它还可以更好地扩展,因为您的资源服务器不需要身份验证,只需要授权和验证令牌。它还增加了为每个请求生成新令牌的开销。虽然我不推荐这门课程,但以下是如何做到这一点:

正如您所发现的,您无法直接更新会话,但是如果深入研究源代码,您将发现
ember simple auth
使用一个更新会话。但是,只有覆盖/自定义
验证器时,此事件才会起作用。可能是
ember简单身份验证令牌
authenticators/jwt.js
。如果您查看他们的验证器,您可以看到一个如何进行验证的示例

因此,我建议您创建自己的自定义JWT令牌验证器,该验证器扩展了
ember simple auth token
。它可能会添加一个方法来更新
会话
,或者更好地处理包含新访问令牌的原始请求头

完成后,你有一个选择。您可以覆盖自己的
适配器
并从那里自己调用该函数,或者更好的选择是覆盖
ember simple auth
数据适配器mixin
mixin

如果覆盖
ember simple auth
数据适配器mixin
,这似乎是最好的起点:。如果重写该函数,您应该可以访问原始API响应,从中可以调用更新会话函数

正如您所看到的,这不是一个微不足道的变化。这肯定与这些库最初设计的目的背道而驰,但是如果你投入大量的工作,这应该是可能的

OP评论的更新
我以前实际实现了这两个要求:“1)在预先配置的空闲时间之后有会话超时。2)允许某些用户代理并动态切换登录用户的上下文”。事实证明,使用刷新令牌模型实际上非常容易实现

要支持#1,刷新令牌到期时间应设置为注销前的空闲时间长度。e、 g.如果刷新令牌设置为在30分钟内到期,而访问令牌在5分钟内到期。客户机将根据回旋余地每隔~5分钟自动获取新的访问令牌(以及可选的刷新令牌)。但是,如果用户离开页面超过30分钟,刷新令牌将过期,他们将需要重新验证

对于#2,不幸的是,它确实需要重写
ember simple auth token
才能工作,但它相对简单,而且我已经实现了一些功能。基本上,您可以创建一个自定义身份验证器,该身份验证器具有一个附加功能,用于为具有更新的上下文/状态的新身份验证器交换和访问令牌。请参见下面我的实现:

ember简单身份验证令牌
Overrided authenticator:

 /**
    Provides a public method to call to exchange an access token for an
    updated access token with updated data encoded in it. This method
    essentially asks the backend to update an access token with different
    values. This is, at the moment, is only used to switch the company root
    attribute in the token (AKA switch companies for admins).

    @param {string} token - The valid access token
    @param {object} [headers] - An optional object which can add additional
    headers to the request

    @param {object} additionalData - An object which contains the data which should be updated on the token. It should look  something like this:
    ```
    {
        company_root_id: '<UUID of a valid company root>'
    }
    ```
    @return {Promise} A promise which is the request. It will either resolve
    with the updated session data or reject with the error.
  */
 exchangeAccessToken(token, headers, additionalData) {
     const data = this.makeRefreshData(token);
     Ember.merge(data, additionalData);

     return new Ember.RSVP.Promise((resolve, reject) => {
         this.makeRequest(this.serverTokenRefreshEndpoint, data, headers).then(response => {
             Ember.run(() => {
                 try {
                     const sessionData = this.handleAuthResponse(response);

                     this.trigger('sessionDataUpdated', sessionData);
                     resolve(sessionData);
                 } catch(error) {
                     reject(error);
                 }
             });
         }, (xhr, status, error) => {
             Ember.Logger.warn(`Access token could not be refreshed - server responded with ${error}.`);
             reject();
         });
     });
 }

后端显然需要扩展以接受刷新令牌端点上的其他参数,这允许用户在授权的情况下切换角色。

我正在从后端服务接收JWT令牌作为每个响应头的一部分。我们的想法是,在身份验证期间,最初将到期时间设置为30分钟,然后每次与备份的令牌交互时,我都会尝试捕获新令牌,并在会话中使用adapter->handleresponse方法更新它。简言之,我所要做的就是创建一个滑动会话。我面临的问题是,Ember simple auth将令牌和到期时间存储在session.data.authenticated中,这在文档中称为只读。如果不允许我更新令牌,我如何才能保持会话的有效性?嗨,Michael,谢谢你的宝贵建议。我对刷新令牌的想法基于两个要求:1)在预先配置的空闲时间之后有会话超时。2) 允许某些用户组代理并动态切换登录用户的上下文。正如您所建议的,我正在评估完成这些任务的其他方法,并且不必覆盖ember simple auth的基本实现。如果这些方法失败,那么作为最后手段,我们将尝试扩展验证器和mixin。@PrajwalBoloor,我更新了我的答案,以展示如何使用刷新令牌模型来完成您的需求。
 switchCompany(companyId) {
     let session = this.get('_session.session');

     if(!this.get('isAdministrator')) {
         throw new Error('Logged in user is not an administrator, they cannot switch companies.');
     }

     let token = session.get('authenticated.access_token');
     let appInstance = Ember.getOwner(this);
     let authorizerName = session.get('authenticator');
     let authorizer = appInstance.lookup(authorizerName);
     if(!authorizer) {
         throw new Error(`Authorizer (${authorizerName}) does not exist`);
     }
     if(typeof authorizer.exchangeAccessToken !== 'function') {
         throw new Error(`Authorizer (${authorizerName}) does not have an \`exchangeAccessToken\` method.`);
     }
     return authorizer.exchangeAccessToken(token, null, {
         company_root_id: companyId
     });
 }