我有一个应用程序可以通过此处概述的工作流程从Chrome扩展程序访问Google API。
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。
在此之前,我曾要求使用Contacts 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禁止。我似乎没有问题访问我提到的其他API虽然这个OAuth流程。我已经在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 Unauthorized。
同样,访问我提到的其他API也没有问题。
非常感谢任何输入。
答案 0 :(得分:5)
这个问题可能相当模糊,所以我将分享我最终如何解决它。
我将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)了。
希望这对扩展建设者有帮助!