2014-01-09 144 views
0

我有一個與API會話的單頁應用程序。我擁有這兩部分(API和單頁應用程序,即「官方客戶端」)。客戶端是JavaScript,非常異步。在異步中刷新OAuth2令牌JS

我遇到的問題是由於Javascript的異步特性而導致令牌過期。

我使用的OAuth2的實現將立即撤銷所有以前的訪問令牌,當使用刷新令牌時(根據OAuth2規範,這很好)。由於這個原因,我不知道如何刷新JS中的標記,而沒有可能遇到兩個異步請求不斷撤銷對方標記的情況。或者一個異步請求撤銷訪問令牌,另一個請求正好用於提出請求。

你們如何解決這個問題?

回答

1

找到了自己,這對我的作品(CoffeeScript中,Object.clone是Sugar.JS):

tokenReloadPromise = null 

    $.ajaxPrefilter (options, userOptions, xhr)=> 
     if tokenReloadPromise? 
     xhr.abort() 
     tokenReloadPromise.then -> 
      options.noTokenRefresh = true 
      $.ajax(options) 
     else 
     originalOptions = Object.clone(options) 
     # configure access token for request here 
     unless options.noTokenRefresh == true 
      options.error = (xhr)-> 
      if xhr.status == 401 
       tokenReloadPromise ?= new jQuery.Deferred 
       tokenReloadPromise.then -> 
       originalOptions.noTokenRefresh = true 
       $.ajax(originalOptions) 
       App.execute "refresh:access_token", -> 
       promise = tokenReloadPromise 
       tokenReloadPromise = null 
       promise.resolve() 
      else 
       originalOptions.error.apply(this, arguments) 
    true 
相關問題