我有一个与API对话的单页应用。我拥有这两个部分(API和单页应用程序又名“官方客户”)。客户端是javascript,所以异步。
我遇到的问题是令牌过期时,由于Javascript的异步性质。
当使用刷新令牌时,我使用的OAuth2的实现将立即撤销所有先前的访问令牌(根据OAuth2规范,这很好)。
因此,我不知道如何刷新JS中的令牌而不会遇到2个异步请求不断撤销彼此令牌的场景。或者一个异步请求撤销访问令牌,另一个请求即将用于发出请求。
你们是如何解决这个问题的?
答案 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