2015-06-19 118 views
2

我生成我的JWT,如果我的令牌是正確的,爲什麼不工作?在谷歌開發者控制檯我的Gmail以及YouTube等API,憑證生成和下載JSON如何訪問gmail API?

{ 
    "private_key_id": "22dcf", 
    "private_key": "-----BEGIN PRIVATE KEY-----(remove)-----END PRIVATE KEY-----\n", 
    "client_email": "[email protected]", 
    "client_id": "jc6.apps.googleusercontent.com", 
    "type": "service_account" 
} 

首先生成令牌

var sHead=JSON.stringify({"alg":"RS256","typ":"JWT"});  
      var iat=timeStampf(); 
      var exp=iat+3600; 
      var sPayload=JSON.stringify({ 
         "iss":client_email, 
         "scope":scope,//gmail scope https://mail.google.com/     
         "aud":"https://www.googleapis.com/oauth2/v3/token", 
         "exp":exp, 
         "iat":iat 
        });   
      var sJWS = KJUR.jws.JWS.sign("RS256", sHead,sPayload, private_key); 
      var paramstoken="grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-ty 

pe%3Ajwt-bearer&assertion="+sJWS 



    getToken("POST","/oauth2/v3/token",paramstoken,jsonData,replier); 
/*rest petition return 200 OK 
     { 
     "access_token" : "1bHLl5EOtu1pxz3fmmetKx9W8CV4t79M", 
     "token_type" : "Bearer", 
     "expires_in" : 3600 
    }*/ 

下一個測試我令牌

function testToken(accessToken,replier) 
{ 
// /gmail/v1/users/me/messages /plus/v1/people/me 
    var client = vertx.createHttpClient().host(urlbase).port(443).ssl(true).maxPoolSize(10);  
    var request = client.request("GET", "/gmail/v1/users/me/messages", function(resp) { 
     console.log('server returned status code: ' + resp.statusCode()); 
     console.log('server returned status message: ' + resp.statusMessage()); 
     resp.bodyHandler(function(body) {   
      replier(JSON.parse(body.toString())); 
     }); 
    }); 
    request.headers() 
    .set("Content-type", contentType) 
    .set("Authorization", "Bearer "+accessToken); 
    request.end(); 
    client.close(); 
} 

如果我使用谷歌+範圍和這個請願的答案是200好

 https://www.googleapis.com/auth/plus.me /plus/v1/people/me 
    { 
"kind":"plus#person", 
"etag":"\"LR9iFZQGXELLHS07eQ\"", 
"objectType":"person","id":"1149981343","displayName":"","name":{"familyName":"","givenName":""},"image":{"url":"https://lh3.googleusercontent.com/-XdUIqdMkCWA/AAAAAAAAAAI/AAAAAAAAAAA/4252rscbv5M/photo.jpg?sz=50","isDefault":true},"isPlusUser":false,"language":"en_US","circledByCount":0,"verified":false} 

,但如果我使用Gmail

{"error":{"errors":[{"domain":"global","reason":"failedPrecondition","message":"Bad Request"}],"code":400,"message":"Bad Request"}} 

回答

2

嘗試在Gmail的情況下,你要訪問一個特定用戶的數據,因此創建了智威湯遜的時候,你需要指定你是誰試圖模仿用戶,即您想要訪問其郵箱的用戶。

您可以使用子做到這一點:在該JWT聲明組

var sPayload=JSON.stringify({ 
        "iss":client_email, 
        "sub":USER_EMAIL_ADDRESS 
        "scope":scope,//gmail scope https://mail.google.com/     
        "aud":"https://www.googleapis.com/oauth2/v3/token", 
        "exp":exp, 
        "iat":iat 
       }); 
+0

好TY,新的錯誤,新的問題時,「用戶的電子郵件地址參數」,下一步 –