我試圖使用nodejs爲我的服務帳戶獲取oauth2令牌。我在下面這裏找到的文檔:Nodejs發佈請求以獲取服務帳戶的oauth2令牌
https://developers.google.com/identity/protocols/OAuth2ServiceAccount#makingrequest
雖然還沒有一個節點的例子,我已經看過了HTTP/REST文件,以獲得它做了一個請求時,需要一個粗略的想法令牌。然而,我回來的迴應是:
無效的JWT簽名。
作爲計算簽名的一般概述,您可以使用base64url編碼的值作爲標題和聲明,使用sha256和來自Google開發者控制檯的私鑰對其進行哈希處理,然後使用base64url對該值進行編碼。
所以我的頭是:
var header = {"alg":"RS256","typ":"JWT"}
var encodedHeader = base64url(new Buffer(header).toString('utf8'));
上面甚至文檔列出這個值是什麼base64url後對其進行編碼:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
當我輸出我encodedHeader值:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9
哦,它匹配很好。所以不應該有其他值的64burl編碼問題。接下來是索賠:
var claim ={"aud":"https://www.googleapis.com/oauth2/v4/token","scope":"https://www.googleapis.com/auth/gmail.send","iss":"*****censoredvalue*****gserviceaccount.com","exp":1505399833,"iat":1505396233}
它經歷了相同的過程,並進行了編碼(出於安全原因無法顯示)。
var encodedClaim = base64url(new Buffer(claim).toString('utf8'));
就目前我使用的是第三方網站來計算測試目的的簽名,但輸入的是encodedHeader.encodedClaim +私有密鑰(值爲:----- BEGIN PRIVATE KEY .... )並使用SHA256。然後我會把這個輸出和b64url編碼。
我現在有一個JWT是encodedHeader.encodedClaim.encodedSignature
var encoded_jwt = encodedHeader + '.' + encodedClaim + '.' + encodedSignature;
我要讓令牌端點的要求有以下:
// Set the headers
var headers = {
'HTTP-Version': 'HTTP/1.1',
'Content-Type': 'application/x-www-form-urlencoded'
}
var bodyOptions = { 'grant_type': "urn:ietf:params:oauth:grant-type:jwt-bearer", assertion: encoded_jwt }
// Configure the request
var options = {
url: 'https://www.googleapis.com/oauth2/v4/token',
method: 'POST',
headers: headers,
form: bodyOptions,
json: true
}
// Start the request
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// Print out the response body
console.log(body)
}
else{
context.log(error);
context.log(response);
}
});
這是從哪裏獲得一個錯誤的回覆說我有一個無效的簽名。
任何有關爲什麼它是無效簽名的想法。我也嘗試了幾個簽名生成網站,以確保它不是一個特定的網站,但它始終是相同的錯誤。