2017-04-11 92 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

这里的例子
相关问题