2014-01-09 87 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 
相关问题