从Access Token获取Google登录个人资料信息 - Golang

时间:2017-04-11 07:16:14

标签: go google-signin googlesigninapi

我有以下JavaScript代码

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

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

我发送了Google登录golang网络应用的代码。 我成功地从POST https://www.googleapis.com/oauth2/v4/token获得了访问令牌。

我的问题是,我无法获取用户的个人资料信息(例如电子邮件,显示名称等)。

我已尝试向GET https://www.googleapis.com/auth/userinfo.profile?access_token=xxx发送请求,但我收到空回复(空白正文)。

1 个答案:

答案 0 :(得分:0)

您必须解码POST https://www.googleapis.com/oauth2/v4/token返回的Google ID令牌才能将其转换为Google+ ID,然后您可以使用GET https://www.googleapis.com/plus/v1/people/[gplusID]?access_token=[accessToken]

  

使用Go,您可以使用以下内容解码google ID令牌   功能。通常,验证ID令牌至关重要   在使用它之前,但是因为你直接与之通信   Google通过中间免费HTTPS渠道并使用您的客户端   向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

查看示例