在异步JS中刷新OAuth2令牌

时间:2014-01-09 16:18:48

标签: javascript oauth oauth-2.0

我有一个与API对话的单页应用。我拥有这两个部分(API和单页应用程序又名“官方客户”)。客户端是javascript,所以异步。

我遇到的问题是令牌过期时,由于Javascript的异步性质。

当使用刷新令牌时,我使用的OAuth2的实现将立即撤销所有先前的访问令牌(根据OAuth2规范,这很好)。

因此,我不知道如何刷新JS中的令牌而不会遇到2个异步请求不断撤销彼此令牌的场景。或者一个异步请求撤销访问令牌,另一个请求即将用于发出请求。

你们是如何解决这个问题的?

1 个答案:

答案 0 :(得分: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