Получить данные профиля для входа в Google из токена доступа - Golang

У меня есть следующий код 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 и получил пустой ответ (пустое тело).


person Acidic9    schedule 11.04.2017    source источник


Ответы (1)


Вы должны расшифровать токен идентификатора Google, возвращенный POST https://www.googleapis.com/oauth2/v4/token, чтобы преобразовать его в идентификатор Google+, после чего вы можете использовать GET https://www.googleapis.com/plus/v1/people/[gplusID]?access_token=[accessToken].

Используя Go, вы можете декодировать токен Google ID, используя следующую функцию. Обычно очень важно проверить токен идентификатора перед его использованием, но, поскольку вы напрямую общаетесь с Google по каналу HTTPS без посредников и используете свой секрет клиента для аутентификации себя в Google, вы можете быть уверены, что токен, который вы получите действительно исходит от Google и является действительным. Если ваш сервер передает токен идентификатора другим компонентам вашего приложения, крайне важно, чтобы другие компоненты проверяли токен перед его использованием.

Используя 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.

person Acidic9    schedule 11.04.2017