簡體   English   中英

如何使用Javascript從Google Api檢索服務帳戶OAuth2令牌?

[英]How can I retrieve a service account OAuth2 token from Google Api with Javascript?

我需要使用Google Project服務帳戶來使用JavaScript訪問Google API。 為了做到這一點,我需要對Google API服務器進行OAuth2認證。

我知道Google提供了可在節點服務器上使用的庫(GAPI),但是我需要一個可以在其他安全JavaScript環境中使用的解決方案。

此任務有兩個主要部門。

  1. 配置
  2. 編碼

首先配置步驟。

  • 如果您沒有Google帳戶:
    1. 導航到google.com
    2. 查找並單擊“登錄”
    3. 點擊“更多選項”
    4. 點擊“創建帳戶”
    5. 請按照以下步驟創建一個帳戶
  • 導航到api儀表板: console.developers.google.com/apis/dashboard
  • 通過單擊當前項目來選擇或創建一個項目。 我顯示的項目稱為“我的項目” 在此處輸入圖片說明

  • 點擊 谷歌啟用API和服務 並啟用您打算使用的API

  • 導航至憑證部分: console.developers.google.com/apis/credentials
  • 點擊 谷歌創建憑據 然后選擇“服務帳戶密鑰”
    • 如果您創建一個新的服務帳戶,為了進行測試,請將角色設置為“項目”“所有者”。 您最終將想了解google Api角色。 請參閱管理角色向服務帳戶授予角色
  • 確保“密鑰類型”為“ Json”,然后單擊“創建”。 您的密鑰/證書將自動下載

現在是編碼部分。

  • 首先下載jsrsasign,並添加對“ jsrsasign-all-min.js”的引用。 如果您願意,可以從github下載“ jsrsasign-all-min.js”
  • 其次,使用您的cert / key(先前下載的)更新以下腳本:

     function postJWT(jwt, callback) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState == 4) { if (this.status == 200 && callback) { callback(this.responseText); return; } if (console) console.log(this.responseText); } }; var parameters = "grant_type=" + encodeURIComponent("urn:ietf:params:oauth:grant-type:jwt-bearer") + "&assertion=" + encodeURIComponent(jwt); xhttp.open("POST", "https://www.googleapis.com/oauth2/v4/token", true); xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhttp.send(parameters); } function getCert() { var cert = //your json key (downloaded earlier) goes here { "type": "service_account", "project_id": "proj..", "private_key_id": "e18..", "private_key": "-----BEGIN PRIVATE KEY-----\\nMII..==\\n-----END PRIVATE KEY-----\\n", "client_email": "service-account@...iam.gserviceaccount.com", "client_id": "5761..", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/..service-account%40...iam.gserviceaccount.com" }; return cert; } function getJWT() { var cert = getCert(); var key = KEYUTIL.getKey(cert.private_key); var headers = { "alg": "RS256", "typ": "JWT" }; var issued = Math.floor(new Date().getTime()/1000); var claims = { "iss": cert.client_email, "scope": "https://www.googleapis.com/auth/analytics.readonly", "aud": "https://www.googleapis.com/oauth2/v4/token", "exp": issued + 3600, "iat": issued }; var jwt = KJUR.jws.JWS.sign(headers.alg, headers, JSON.stringify(claims), key); return jwt; } 
  • 測試代碼時,您應該收到一個帶有auth令牌的json對象。 您可以像這樣測試實現:

     postJWT(getJWT(text), function(){ let token = JSON.parse(response).access_token; //Do your api calls here using the token. //Reuse the token for up to 1 hour. }); 

這是帶有令牌的成功json對象的示例:

{
    "access_token": "ya29.c.ElkABZznrLNLK6ZAq2ybiH5lsRJpABE8p7MlZZJ0WCKcDNDv75lh-o1iRX__uMNUKSySiawm4YJGsbfqJH2JH61nRK6O2m0GJR7DgkEmo6ZlKtrvzke9C3xpwA",
    "token_type": "Bearer",
    "expires_in": 3600
}

請注意,這種方法要求您可以從JavaScript環境中訪問密鑰/證書。 如果此環境是公共環境,則您的api容易受到攻擊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM