chrome.identity.launchWebAuthFlow,如何清除用户缓存?

6
我正在开发一个与 Gmail 协作的扩展,希望用户可以在多个 Gmail 帐户之间切换,并仍能使用 Google REST API。我使用 chrome.identity.launchWebAuthFlow 来获取对 Google API 的 OAuth2 访问令牌。
该工作流程会打开一种模态的 Chrome Webview,顶部没有 url 栏。首次输入用户名和密码,并允许请求的范围后,webview 就会关闭。然后,我的应用程序会收到包含访问令牌的重定向 URI。很好。
问题出现在切换用户时。人们会认为只需检查新的电子邮件是否已登录,然后再次使用 chrome.identity.launchWebAuthFlow 来获取新令牌即可。
但不幸的是,第一个已登录用户似乎仍被缓存在系统中。
function webAuthFlow(userEmail, forceApprovalPrompt, xhrCallback) {
  var baseUrl = 'https://accounts.google.com/o/oauth2/auth';
  var forceApprovalPrompt = forceApprovalPrompt || 'auto';
  var urlParams = {
    'redirect_uri' : 'https://inobjcmbajbmllkgkigemcfnikdmlidn.chromiumapp.org/callback',
    'response_type' : 'token',
    'client_id' : 'not shown here',
    'scope' : 'https://mail.google.com/ https://www.google.com/m8/feeds/',
    'approval_prompt' : 'force',
    'include_granted_scopes' : 'true'
  };

  var providerDetails = {
    url : baseUrl + '?' + stringify(urlParams),
    interactive : true
  }
  var xhrCallback = xhrCallback || false;
  console.log(xhrCallback);
  var callback = function(responseUrl) {
    var params = {}, 
    queryString = responseUrl.split('#')[1],
    regex = /([^&=]+)=([^&]*)/g,
    m,
    validateUrl = 'https://www.googleapis.com/oauth2/v1/tokeninfo'
    while (m = regex.exec(queryString)) {
      params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
    }
    validateToken(params.access_token, function() { storeToken(params.access_token, userEmail) }, xhrCallback);
  };
  chrome.identity.launchWebAuthFlow(providerDetails, callback);
};

我尝试通过将approval_prompt设置为'force'来检查弹出的Chrome Webview。它似乎有一些与之相关的cookies。我想知道如何清除Webview中的持久数据。
唯一有效的方法似乎是完全关闭Chrome。这对我的扩展来说不是可接受的用户体验。
如果有人能提供任何指导,提前感谢您。

1
可能是重复的问题:如何从chrome.identity oauth提供者注销 - Xan
1
是的,removeCachedAuthToken() 似乎对通过 launchWebAuthFlow 获得的令牌没有影响。我认为问题依然存在。 - zorborac
所以评论中的“答案”是已知的错误。 - Xan
2个回答

0
如果您想要移除以下内容:
  • 从令牌缓存中移除访问令牌
  • 移除用户账户偏好设置
  • 将用户从所有授权流程中移除
那么您可以使用以下两种方式之一:
  1. 使用以下代码行删除所有身份验证令牌

    chrome.identity.clearAllCachedAuthTokens(() => undefined)
    
  2. 逐个删除每个身份验证令牌。有关更多信息,请参阅此参考文献:removeCachedAuthToken

    chrome.identity.removeCachedAuthToken(
       details: InvalidTokenDetails,
       callback?: function,
    )
    

-1

使用chrome.identity.removeCachedAuthToken(object details, function callback)方法。

从身份验证API的令牌缓存中删除OAuth2访问令牌。

如果发现访问令牌无效,则应将其传递给removeCachedAuthToken以从缓存中删除它。然后,应用程序可以使用getAuthToken获取新令牌。


1
你读了问题下面的评论吗?目前这个链接无法使用:https://code.google.com/p/chromium/issues/detail?id=328876 - Xan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接