Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
Javascript 刷新异步JS中的OAuth2令牌_Javascript_Oauth_Oauth 2.0 - Fatal编程技术网

Javascript 刷新异步JS中的OAuth2令牌

Javascript 刷新异步JS中的OAuth2令牌,javascript,oauth,oauth-2.0,Javascript,Oauth,Oauth 2.0,我有一个与API对话的单页应用程序。我拥有这两个部分(API和单页应用程序又名“官方客户端”)。客户端是javascript,因此是异步的 我遇到的问题是,由于Javascript的异步特性,令牌何时过期 当使用刷新令牌时,我使用的OAuth2的实现将立即撤销所有以前的访问令牌(根据OAuth2规范,这很好) 因此,我不知道如何在JS中刷新令牌,而不会遇到两个异步请求不断撤销彼此令牌的情况。或者一个异步请求撤销另一个请求正要用于发出请求的访问令牌 你们是如何解决这个问题的?我自己发现,这对我来说

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

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

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

因此,我不知道如何在JS中刷新令牌,而不会遇到两个异步请求不断撤销彼此令牌的情况。或者一个异步请求撤销另一个请求正要用于发出请求的访问令牌


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

我自己发现,这对我来说很有用(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