1

我有一個應用程序可以通過此處概述的工作流程訪問Chrome擴展程序中的Google API。從Chrome擴展的GMail API訪問? 403 Forbidden

Chrome Extensions OAuth Tutorial

工作流程的基礎是初始化的OAuth流

var oauth = ChromeExOAuth.initBackgroundPage({ 
    'request_url': 'https://www.google.com/accounts/OAuthGetRequestToken', 
    'authorize_url': 'https://www.google.com/accounts/OAuthAuthorizeToken', 
    'access_url': 'https://www.google.com/accounts/OAuthGetAccessToken', 
    'consumer_key': '{MY_CLIENT_ID}', 
    'consumer_secret': '{MY_CLIENT_SECRET}', 
    'scope': 'https://www.google.com/m8/feeds/ https://apps-apis.google.com/a/feeds/emailsettings/2.0/ https://mail.google.com/', 
    'app_name': 'Gmail Plugin', 
    'callback_page': 'src/google-oauth/chrome_ex_oauth.html' 
}); 

在安裝擴展性,用戶被引導到對話框頁面進行驗證,並同意我要求的範圍。從這裏我推斷我的消費者鑰匙和祕密是可以的。我已經允許在Google Developers控制檯中訪問GMail,Contacts和Admin SDK。

在此之前,我有要求使用聯繫人API和Admin SDK API的請求。我現在試圖添加一些利用Gmail REST API的功能。

設置請求的下一步是從後臺頁面發出請求。

function getSentEmails() { 
    var emailCollection; 
    var url = "https://www.googleapis.com/gmail/v1/users/me/messages"; 
    var request = { 
    'method': 'GET', 
    'parameters': { 
     'labelIds': 'SENT' 
    } 
    }; 
    var callback = function(response, xhr) { 
    emailCollection = JSON.parse(response); 
    console.dir(emailCollection); 
    } 
    oauth.sendSignedRequest(url, callback, request); 
}; 

的方式簽署的請求工作是調用一個方法來完成的OAuth舞蹈下一步,

oauth.authorize(function() { 
    getSentEmails(); 
    }); 

這導致故宮每次403。我似乎沒有問題訪問我通過此OAuth流提到的其他API。我已經允許的範圍在我的manifest.json

的manifest.json

"permissions": [ 
    "tabs", 
    "storage", 
    "https://mail.google.com/*", 
    "https://www.google.com/m8/feeds/*", 
    "https://apps-apis.google.com/a/feeds/emailsettings/2.0/*", 
    "https://www.googleapis.com/gmail/v1/users/*", 
    "https://www.googleapis.com/auth/gmail.modify/*", 
    "https://www.googleapis.com/auth/gmail.compose/*", 
    "https://www.googleapis.com/auth/gmail.readonly/*", 
    "https://www.google.com/accounts/OAuthGetRequestToken", 
    "https://www.google.com/accounts/OAuthAuthorizeToken", 
    "https://www.google.com/accounts/OAuthGetAccessToken" 
    ] 

我試圖建立HTTP請求作爲在鏈接上面概述的另一種方法。

function stringify(parameters) { 
    var params = []; 
    for(var p in parameters) { 
    params.push(encodeURIComponent(p) + '=' + 
       encodeURIComponent(parameters[p])); 
    } 
    return params.join('&'); 
}; 
function xhrGetSentEmails() { 
    var method = 'GET'; 
    var url = 'https://www.googleapis.com/gmail/v1/users/me/messages'; 
    var params = {'labelIds': 'SENT'}; 
    var callback = function(resp, xhr) { 
     console.log(resp); 
    } 
    var xhr = new XMLHttpRequest(); 
    xhr.onreadystatechange = function(data) { 
     callback(xhr, data); 
    }; 
    xhr.open(method, url + '?' + stringify(params), true); 

    xhr.setRequestHeader('Authorization', oauth.getAuthorizationHeader(url, method, params)); 
    xhr.send(); 
    } 

我得到了同樣的403這樣做。

我相信我驗證正確不過的,因爲如果我改變

xhr.setRequestHeader('Authorization', oauth.getAuthorizationHeader(url, method, params)); 

xhr.setRequestHeader('Authorization','foo' + oauth.getAuthorizationHeader(url, method, params)); 

我得到一個401未授權代替。

再次,沒有麻煩訪問我提到的其他API。

任何輸入將不勝感激。

回答

4

這個問題可能是相當模糊的,所以我會分享我最終如何解決它。

我將我的Chrome擴展程序OAuth 2.0工作流程遷移到了較新版本(自Chrome 29以來)chrome.identity設置了應用和擴展程序。

此處爲擴展設置OAuth 2.0的詳細說明。現在

Chrome Identity API User Authentication

我可以使用

chrome.identity.getAuthToken(function(token) { 
    // Do HTTP API call with token 
}); 

,沒有我的HTTP請求拿出禁止(403)了。

希望這有助於擴展建設者在那裏!