2017-04-11 5 views
1

Ich habe den folgenden JavaScript-CodeGet Google Anmelden Profil-Information von Access Token - Golang

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

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

Ich schicke den Code für ein Google melden Sie sich an, um meine golang Web-App. Ich habe ein Zugriffs-Token von POST https://www.googleapis.com/oauth2/v4/token erfolgreich erhalten.

Mein Problem ist, ich bin nicht in der Lage die Benutzerprofilinformationen (wie zB E-Mail, Anzeigename usw.)

Ich habe versucht zu bekommen eine Anfrage an GET https://www.googleapis.com/auth/userinfo.profile?access_token=xxx senden und erhalten eine leere Antwort (Leerkörper) .

Antwort

0

Sie müssen die Google-ID-Token von POST https://www.googleapis.com/oauth2/v4/token zurück dekodieren sie in eine Google+ ID konvertieren, dann können Sie GET https://www.googleapis.com/plus/v1/people/[gplusID]?access_token=[accessToken]

Mit Go verwenden, können Sie die Google-ID-Token mit dem folgenden Funktion entschlüsseln. Normalerweise ist es wichtig, dass Sie ein ID-Token vor der Verwendung validieren, aber da Sie direkt mit Google über einen intermediate-freien HTTPS-Kanal kommunizieren und Ihren Client Secret verwenden, um sich bei Google zu authentifizieren, können Sie darauf vertrauen Der Token, den Sie erhalten, stammt wirklich von Google und ist gültig. Wenn Ihr Server das ID-Token an andere Komponenten Ihrer App übergibt, ist es äußerst wichtig, dass die anderen Komponenten das Token vor der Verwendung überprüfen.

Mit Go können Sie das ID-Token mit der folgenden Funktion dekodieren.

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 
} 

Schauen Sie sich hier ein Beispiel an https://play.golang.org/p/M7sYmE2ztx