2017-04-11 94 views
1

我有以下的JavaScript代碼獲取谷歌登錄資料信息從訪問令牌 - Golang

auth2.grantOfflineAccess().then(function(codeData) { 
    if (!codeData) { 
     alert("Something went wrong"); 
     return; 
    } 

    $.post("/do/signIn/google", codeData, function() { ... }); 
}); 

我發送代碼爲谷歌登錄我golang web應用程序。 我成功從POST https://www.googleapis.com/oauth2/v4/token獲得訪問令牌。

我的問題是,我無法獲取用戶的個人信息(如電子郵件,顯示名稱等)

我試圖發送給GET https://www.googleapis.com/auth/userinfo.profile?access_token=xxx的請求,我收到一個空的響應(坯體) 。

回答

0

必須解碼由POST https://www.googleapis.com/oauth2/v4/token返回的谷歌ID令牌,將其轉換成Google+的ID,那麼你可以使用GET https://www.googleapis.com/plus/v1/people/[gplusID]?access_token=[accessToken]

使用去,你可以使用下面的 解碼功能的谷歌ID令牌。通常,在使用ID令牌 之前驗證ID令牌非常重要,但由於您通過無中介HTTPS渠道直接與Google通信,並使用您的客戶端向Google進行身份驗證,所以您可以確信 您收到的令牌確實來自Google並且有效。如果您的 服務器將ID令牌傳遞給您的應用程序的其他組件,則在使用該令牌之前,其他組件驗證令牌 極其重要,它是 。

使用Go,您可以使用以下函數解碼ID令牌。

func decodeGoogleIDToken(idToken string) (gplusID string, err error) { 
    var set struct { 
     Sub string 
    } 
    if idToken != "" { 
     // Check that the padding is correct for a base64decode 
     parts := strings.Split(idToken, ".") 
     if len(parts) < 2 { 
      return "", fmt.Errorf("Malformed ID token") 
     } 
     // Decode the ID token 
     s := parts[1] 
     switch len(s) % 4 { 
     case 2: 
      s += "==" 
     case 3: 
      s += "=" 
     } 

     b, err := base64.URLEncoding.DecodeString(s) 
     if err != nil { 
      return "", fmt.Errorf("Malformed ID token: %v", err) 
     } 
     err = json.Unmarshal(b, &set) 
     if err != nil { 
      return "", fmt.Errorf("Malformed ID token: %v", err) 
     } 
    } 
    return set.Sub, nil 
} 

退房在https://play.golang.org/p/M7sYmE2ztx

這裏的例子
相關問題