2017-11-10 119 views
0

我需要使用Google项目服务帐户才能使用JavaScript访问Google API。为了做到这一点,我需要OAuth2谷歌API服务器来获得一个身份验证令牌。如何从Google Api使用Javascript检索服务帐户OAuth2令牌?

我知道Google提供了一个用于节点服务器的库(GAPI),但我需要一个能在其他安全JavaScript环境中工作的解决方案。

回答

0

这个任务有两大部门。

  1. 配置
  2. 编码

首先配置步骤。

  • 如果你没有一个谷歌帐户:
    1. 导航到google.com
    2. 找到并点击 “登录”
    3. 点击 “更多选项”
    4. 单击 “创建帐户”
    5. 按照步骤创建一个帐户
  • 导航至api控制面板:console.developers.google.com/apis/dashboard
  • 通过单击当前项目来选择或创建项目。该项目中,我有一个展示被称为“我的项目” enter image description here

  • 点击google enable apis and services,使那些你打算与

  • 导航到凭证部分工作API:console.developers.google.com/apis/credentials
  • 点击google create credentials,选择“服务帐户的关键“
  • 确保“密钥类型”是“Json”并单击“创建”。您的密钥/证书将自动下载

现在为编码部分。

  • 首次下载jsrsasign并添加对“jsrsasign-all-min.js”的引用。如果你愿意,你可以从GitHub下载只是“jsrsasign-ALL-min.js”
  • 二更新您的证书/密钥(先前下载)下面的脚本:

    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": "[email protected]", 
          "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; 
    } 
    
  • 当你测试你的代码你应该收到一个带有认证令牌的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就很脆弱。

+0

嗨,我想知道如何结合调用谷歌分析api – Elvira

+0

@Elvira我已经更新了代码,以反映你应该放置你的API调用。如果您需要使用令牌设置api调用的帮助,请提出一个新问题并标记我或将其链接到此处,以便我可以提供帮助。我会尽力留意它。 –

相关问题