我一直在研究這個問題很長一段時間,並沒有成功。希望有人能夠對此有所瞭解!chrome.identity.launchwebauthflow特定用戶失敗
我正在使用谷歌瀏覽器擴展程序(瀏覽器操作),在Google之外進行身份驗證/授權(chrome.identity.launchwebauthflow
,interactive
設置爲true
)。我們對某些用戶的認證/授權流程取得了成功,但並非全部。下面是有趣的結果:
- 用戶A點擊擴展圖標,點擊授權按鈕,成功獲取授權碼,交換訪問令牌,並可繼續使用該應用程序。
- 用戶B點擊擴展圖標,點擊授權按鈕,擴展彈出窗口關閉。它在交換代碼訪問令牌之前失敗。
- 用戶B右擊擴展圖標,選擇Inspect彈出窗口,點擊授權按鈕,成功獲取認證碼,交換訪問令牌,並可繼續使用該應用程序。
- 用戶A使用網絡以安全模式啓動設備。用戶A點擊擴展圖標,點擊授權按鈕,擴展彈出窗口關閉。它在交換代碼訪問令牌之前失敗。
- 用戶A使用網絡以安全模式啓動設備。用戶A打開一個標籤並加載該分機的網址(
chrome-extension://pathofextension
)。用戶單擊授權按鈕,成功獲取授權碼,將其交換爲訪問令牌,並可繼續使用該應用程序。 - 擴展轉換爲打包的應用程序。用戶A和B打開應用程序,單擊授權按鈕,成功獲取授權碼,將其交換爲訪問令牌,然後繼續使用該應用程序。
我們認爲這是一個客戶端問題,但我們都使用相同的Chrome版本。什麼會導致擴展程序的彈出窗口在驗證碼返回時關閉?我們無法保持開發者控制檯處於打開狀態,以查看是否出現任何錯誤,因爲開發者控制檯處於打開狀態時工作得很好。我們使用$.ajaxSetup({ cache:false })
來確保緩存對於Ajax請求是禁用的。
這裏的chrome.identity.launchwebauthflow調用(最初是從彈出的稱呼)的一個片段:
chrome.identity.launchWebAuthFlow({url:url,interactive:true},function(response) {
console.log('OAuth Response: '+response);
if (response) {
var authCode = encodeURIComponent(response.substring(response.indexOf('=')+1));
console.log('Auth Code: '+authCode);
userAuthorization(authCode);
} else {
authorizeButton();
}
});
編輯的代碼嘗試應用的代碼,在背景的解決方案後:
彈出腳本現在調用後臺腳本:
chrome.runtime.sendMessage({type:'authorize',url:url},function(response) {
console.log(chrome.runtime.lastError);
console.log(response);
if (response && response.authCode) {
userAuthorization(response.authCode);
} else {
authorizeButton();
}
});
後臺腳本r支持彈出腳本。
chrome.runtime.onMessage.addListener(function(message,sender,sendResponse) {
if (message.type == 'authorize') {
var url = message.url,
authCode;
chrome.identity.launchWebAuthFlow({url:url,interactive:true},function(response) {
console.log('OAuth Response: '+response);
if (response) {
authCode = encodeURIComponent(response.substring(response.indexOf('=')+1));
console.log('Auth Code: '+authCode);
}
sendResponse({authCode:authCode});
});
}
return true;
});
'launchWebAuthFlow'從哪裏調用?彈出代碼? – Xan
launchwebauthflow是從彈出窗口的JavaScript內部調用的(當您單擊該擴展的圖標並彈出窗口出現時)。 – jacorre