it-swarm.com.de

Wie kann ich ein Google-Authentifizierungs-API-Zugriffstoken überprüfen?

Wie kann ich ein Google-Authentifizierungszugriffstoken überprüfen?

Irgendwie muss ich Google abfragen und fragen: Ist [Berechtigungsnachweis erteilt] für das Google-Konto [[email protected]] gültig?

Kurze Version:
Es ist klar, wie ein Zugriffstoken, das über Google Authentication Api :: OAuth Authentication for Web Applications bereitgestellt wird, verwendet werden kann, um Daten aus einem Bereich anzufordern Es ist nicht klar, wie Sie überprüfen können, ob ein bestimmtes Zugriffstoken für ein bestimmtes Google-Konto gültig ist. Ich möchte wissen, wie.

Lange Version:
Ich entwickle eine API, die tokenbasierte Authentifizierung verwendet. Ein Token wird nach Angabe eines gültigen Benutzernamens + Passworts oder nach Angabe eines Token eines Drittanbieters von einem der beiden zurückgegeben N nachprüfbare Leistungen.

Einer der Dienste von Drittanbietern ist Google, sodass sich ein Nutzer mit seinem Google-Konto bei meinem Dienst authentifizieren kann. Dies wird später um Yahoo-Konten, vertrauenswürdige OpenID-Anbieter usw. erweitert.

Schematisches Beispiel für einen Google-basierten Zugriff:

Alternativtext http://webignition.net/images/figures/auth_figure002.png

Die 'API'-Entität steht unter meiner vollen Kontrolle. Die "öffentliche Schnittstelle" ist eine beliebige web- oder desktopbasierte App. Einige öffentliche Schnittstellen sind unter meiner Kontrolle, andere nicht und andere, von denen ich vielleicht noch nie etwas weiß.

Daher kann ich dem in Schritt 3 an die API übermittelten Token nicht vertrauen. Dieses wird zusammen mit der entsprechenden E-Mail-Adresse des Google-Kontos bereitgestellt.

Ich muss irgendwie Google abfragen und fragen: Ist dieses Zugriffstoken gültig für [email protected]?

In diesem Fall ist [email protected] die eindeutige Kennung des Google-Kontos - die E-Mail-Adresse, mit der sich jemand in seinem Google-Konto anmeldet. Es kann nicht davon ausgegangen werden, dass dies eine Google Mail-Adresse ist - jemand kann ein Google-Konto ohne ein Google Mail-Konto haben.

In der Google-Dokumentation ist klar angegeben, wie mit einem Zugriffstoken Daten von einer Reihe von Google-Diensten abgerufen werden können. Nichts scheint zu sagen, wie Sie überprüfen können, ob ein bestimmtes Zugriffstoken überhaupt gültig ist.

Update Das Token ist für N Google-Dienste gültig. Ich kann ein Token nicht gegen einen Google-Dienst testen, um es zu überprüfen, da ich nicht weiß, welche Teilmenge aller Google-Dienste ein bestimmter Nutzer tatsächlich verwendet.

Darüber hinaus werde ich das Google-Authentifizierungszugriffstoken niemals für den Zugriff auf Google-Dienste verwenden, nur um zu überprüfen, ob ein angeblicher Google-Nutzer tatsächlich der ist, für den er sich ausgibt. Wenn es einen anderen Weg gibt, versuche ich es gerne.

103
Jon Cram

Für die Benutzerüberprüfung geben Sie einfach das Zugriffstoken als accessToken ein und senden Sie es und Sie erhalten die Antwort

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=accessToken

sie können die Adressleiste auch in Browsern ausprobieren, httppost und response in Java also

antwort wird wie folgt sein

{
     "issued_to": "xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "audience": "xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
     "user_id": "xxxxxxxxxxxxxxxxxxxxxxx",
     "scope": "https://www.googleapis.com/auth/userinfo.profile https://gdata.youtube.com",
     "expires_in": 3340,
     "access_type": "offline"
    }

Der Gültigkeitsbereich ist die angegebene Berechtigung des accessToken. Sie können die Scope-IDs in dieser Link überprüfen

113

sie können ein Google-Authentifizierungszugriffstoken mithilfe des folgenden Endpunkts überprüfen:

https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=<access_token>

Dies ist Google V3 OAuth AccessToken-Validierungsendpunkt, Sie können aus dem folgenden Google-Dokument verweisen: (In OAUTH 2.0 ENDPOINTS Tab)

https://developers.google.com/identity/protocols/OAuth2UserAgent#validate-access-token

22
Nick Tsai
function authenticate_google_OAuthtoken($user_id)
{
    $access_token   = google_get_user_token($user_id); // get existing token from DB
    $redirecturl    = $Google_Permissions->redirecturl;
    $client_id      = $Google_Permissions->client_id;
    $client_secret  = $Google_Permissions->client_secret;
    $redirect_uri   = $Google_Permissions->redirect_uri;
    $max_results    = $Google_Permissions->max_results;

    $url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.$access_token;
    $response_contacts  =  curl_get_responce_contents($url);
    $response   =   (json_decode($response_contacts));

    if(isset($response->issued_to))
    {
        return true;
    }
    else if(isset($response->error))
    {
        return false;
    }
}
20
ahmed

Ok, die meisten Antworten sind gültig, aber nicht ganz richtig. Die Idee von JWT ist, dass Sie das Token validieren können, ohne sich jedes Mal mit dem Aussteller in Verbindung setzen zu müssen. Sie müssen die ID und die Signatur des Tokens mit dem bekannten öffentlichen Schlüssel des Zertifikats überprüfen, mit dem Google das Token signiert hat.

Lesen Sie im nächsten Beitrag, warum und wie Sie dies tun.

http://ncona.com/2015/02/consuming-a-google-id-token-from-a-server/

7
Remco

Google oauth code flow response gibt neben access_token Auch id_token Zurück, das nützliche Informationen für die Validierung in verschlüsselter Form enthält.

Eine Sache, die ID-Token nützlich macht, ist die Tatsache, dass Sie sie an verschiedene Komponenten Ihrer App weitergeben können. Diese Komponenten können ein ID-Token als einfachen Authentifizierungsmechanismus zur Authentifizierung der App und des Benutzers verwenden. Bevor Sie jedoch die Informationen im ID-Token verwenden oder sich darauf verlassen können, dass der Benutzer sich authentifiziert hat, müssen Sie sie validieren.

Die Validierung eines ID-Tokens erfordert mehrere Schritte:

  • Stellen Sie sicher, dass das ID-Token eine JWT ist, die ordnungsgemäß mit einem geeigneten öffentlichen Google-Schlüssel signiert ist.
  • Stellen Sie sicher, dass der Wert von aud im ID-Token mit der Client-ID Ihrer App übereinstimmt.
  • Stellen Sie sicher, dass der Wert von iss im ID-Token gleich accounts.google.com oder https://accounts.google.com ist.
  • Stellen Sie sicher, dass die Ablaufzeit (exp) des ID-Tokens nicht verstrichen ist.
  • Wenn Sie in der Anfrage einen hd-Parameter übergeben haben, stellen Sie sicher, dass das ID-Token einen hd-Anspruch hat, der Ihrer von Google Apps gehosteten Domain entspricht.

https://developers.google.com/identity/protocols/OpenIDConnect#validatinganidtoken Der Link enthält Codebeispiele für die Validierung von ID-Token.

Siehe auch https://security.stackexchange.com/questions/37818/why-use-openid-connect-instead-of-plain-oauth .

4
Vadzim

Ich muss irgendwie Google abfragen und fragen: Ist dieses Zugriffstoken für [email protected] gültig?

Nein. Sie müssen lediglich die Standardanmeldung mit Verbundanmeldung für Google-Kontonutzer von Ihrer API-Domain anfordern. Und erst danach können Sie die "persistente Benutzer-ID" mit einer von der "öffentlichen Schnittstelle" vergleichen.

Der Realm-Wert wird auf der Anmeldeseite von Google Federated verwendet, um die anfragende Site für den Benutzer zu identifizieren. Es wird auch verwendet, um den Wert der dauerhaften Benutzer-ID zu bestimmen, die von Google zurückgegeben wird.

Sie müssen also aus derselben Domäne stammen wie "öffentliche Schnittstelle".

Und vergessen Sie nicht, dass der Benutzer sicherstellen muss, dass Ihre API vertrauenswürdig ist. Daher fragt Google den Benutzer, ob Sie seine Identität überprüfen können.

1
Malx

Hier ist ein Beispiel mit Guzzle :

/**
 * @param string $accessToken JSON-encoded access token as returned by \Google_Client->getAccessToken() or raw access token
 * @return array|false False if token is invalid or array in the form
 * 
 * array (
 *   'issued_to' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'audience' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
 *   'scope' => 'https://www.googleapis.com/auth/calendar',
 *   'expires_in' => 3350,
 *   'access_type' => 'offline',
 * )
 */
public static function tokenInfo($accessToken) {
    if(!strlen($accessToken)) {
        return false;
    }

    if($accessToken[0] === '{') {
        $accessToken = json_decode($accessToken)->access_token;
    }

    $guzzle = new \GuzzleHttp\Client();

    try {
        $resp = $guzzle->get('https://www.googleapis.com/oauth2/v1/tokeninfo', [
            'query' => ['access_token' => $accessToken],
        ]);
    } catch(ClientException $ex) {
        return false;
    }

    return $resp->json();
}
0
mpen

Ein beliebiges OAuth Zugriffstoken kann nicht zur Authentifizierung verwendet werden, da die Bedeutung des Tokens außerhalb der OAuth= Kernspezifikation liegt. Es könnte für bestimmt sein Ein einziger Verwendungszweck oder ein enges Ablauffenster, oder es könnte einen Zugang bieten, den der Benutzer nicht gewähren möchte. Es ist auch undurchsichtig, und der OAuth Verbraucher, der es erhalten hat, hat möglicherweise nie eine Art von gesehen Benutzerkennung.

Ein OAuth Dienstanbieter und ein oder mehrere Verbraucher könnten leicht OAuth= verwenden, um ein überprüfbares Authentifizierungstoken bereitzustellen, und es gibt Vorschläge und Ideen, um dies zu tun. Aber ein willkürlicher Dienstanbieter, der nur OAuth Core) spricht, kann dies nicht ohne andere Abstimmung mit einem Verbraucher bereitstellen. Die Google-spezifische AuthSubTokenInfo REST) -Methode zusammen mit der Benutzerkennung ist nahe, aber es ist auch nicht geeignet, da es das Token ungültig machen könnte oder das Token abgelaufen sein könnte.

Wenn Ihre Google-ID eine OpenId-ID ist und Ihre "öffentliche Schnittstelle" entweder eine Web-App ist oder den Browser des Benutzers aufrufen kann, sollten Sie wahrscheinlich OpenID OP von Google verwenden.

OpenID besteht nur aus dem Senden des Benutzers an das OP und dem Zurückerhalten einer signierten Zusicherung. Die Interaktion ist ausschließlich zum Nutzen des RP. Es gibt kein langlebiges Token oder ein anderes benutzerspezifisches Handle, das verwendet werden könnte, um anzuzeigen, dass ein RP einen Benutzer mit einem OP erfolgreich authentifiziert hat.

Eine Möglichkeit, eine vorherige Authentifizierung anhand einer OpenID-ID zu überprüfen, besteht darin, die Authentifizierung erneut durchzuführen, sofern derselbe Benutzeragent verwendet wird. Das OP sollte in der Lage sein, eine positive Behauptung ohne Benutzerinteraktion zurückzugeben (z. B. durch Überprüfen eines Cookies oder eines Client-Zertifikats). Es steht dem OP frei, eine weitere Benutzerinteraktion zu erfordern, und dies ist wahrscheinlich der Fall, wenn die Authentifizierungsanforderung von einer anderen Domäne stammt (mein OP gibt mir die Möglichkeit, diesen bestimmten RP erneut zu authentifizieren, ohne in Zukunft zu interagieren). In Googles Fall verwendet die Benutzeroberfläche, über die der Benutzer das OAuth= Token abgerufen hat, möglicherweise nicht dieselbe Sitzungs-ID, sodass der Benutzer sich erneut authentifizieren muss werde die identität behaupten können.

0
Karl Anderson

Versuchen Sie, eine OAuth-authentifizierte Anfrage mit Ihrem Token an https://www.google.com/accounts/AuthSubTokenInfo zu stellen. Dies ist nur für AuthSub dokumentiert, aber es funktioniert auch für OAuth. Es wird Ihnen nicht mitgeteilt, für welchen Benutzer das Token bestimmt ist, aber es wird Ihnen mitgeteilt, für welche Dienste es gültig ist und Die Anforderung schlägt fehl, wenn das Token ungültig ist oder widerrufen wurde.

0
Jonathan