Nutzer authentifizieren

Auf dieser Seite wird beschrieben, wie Sie in Ihrer API die Unterstützung der Nutzerauthentifizierung von Clientanwendungen konfigurieren, die Cloud Endpoints Frameworks verwenden. Derzeit werden Android- und JavaScript-Clients unterstützt.

Endpoints Frameworks unterstützt die Nutzerauthentifizierung von Clientanwendungen, die eine der folgenden Methoden verwenden:

Unabhängig davon, welche Authentifizierungsmethode Sie verwenden, müssen Sie in jeder API-Methode, in der Sie die ordnungsgemäße Authentifizierung prüfen möchten, wie in den folgenden Abschnitten beschrieben, nach einem gültigen User suchen:

Voraussetzungen

Folgende Voraussetzungen sollten erfüllt sein:

Mit Firebase Auth authentifizieren

So unterstützen Sie Aufrufe von Clients, die Firebase Auth verwenden:

  1. Erstellen Sie ein Firebase-Projekt, wenn nicht bereits geschehen. Firebase-Projekte sind Google Cloud Console-Projekte, die Firebase-Dienste nutzen. Weitere Informationen finden Sie unter Was ist ein Firebase-Projekt? und in der Firebase-Dokumentation.

  2. Fügen Sie Folgendes in Ihre @Api- oder Methoden-Annotation ein:

    • Fügen Sie der Annotation einen authenticators-Parameter an, der auf den Wert {EspAuthenticator.class} festgelegt ist.
    • Fügen Sie einen issuers-Parameter hinzu, der einen @ApiIssuer enthält, der auf Firebase gesetzt wurde.
    • Fügen Sie einen issuerAudiences-Parameter hinzu, der einen @ApiIssuerAudience enthält, der auf Firebase und Ihre Projekt-ID gesetzt wurde.

    Beispiel:

    @Api(
        name = "YOUR_API_NAME",
        version = "VERSION_NUMBER",
        authenticators = {EspAuthenticator.class},
        issuers = {
            @ApiIssuer(
                name = "firebase",
                issuer = "https://securetoken.google.com/YOUR_PROJECT_ID",
                jwksUri = "https://www.googleapis.com/service_accounts/v1/metadata/x509/securetoken@system.gserviceaccount.com")
        },
        issuerAudiences = {
            @ApiIssuerAudience(name = "firebase", audiences = "YOUR_PROJECT_ID")
        })
    
    • Ersetzen Sie YOUR_API_NAME durch den Namen der API.
    • Ersetzen Sie VERSION_NUMBER durch Ihre API-Version, z. B. v1.
    • Ersetzen Sie beide Instanzen von YOUR_PROJECT_ID durch Ihre Firebase-Projekt-ID.
  3. Importieren Sie Users in den API-Implementierungscode:

    import com.google.api.server.spi.auth.common.User;
    
  4. Prüfen Sie in jeder API-Methode, mit der Sie eine ordnungsgemäße Authentifizierung gewährleisten möchten, ob ein gültiger User vorhanden ist. Wenn dies nicht der Fall ist, geben Sie, wie in der folgenden Methodendefinition beispielhaft gezeigt, eine Ausnahme zurück:

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  5. Stellen Sie die API noch einmal bereit, wenn Sie neue Clients hinzufügen.

Firebase-Authentifizierung einem Client hinzufügen

Sie können Ihren Code um die Firebase-Authentifizierung erweitern, wie in der Firebase-Dokumentation beschrieben. Dem Client muss ein Google Cloud-Projekt zugeordnet sein und die Projekt-ID muss, wie im vorherigen Abschnitt dargestellt, in der Firebase-Ausstellerkonfiguration der API aufgeführt sein.

Mit Auth0 authentifizieren

So unterstützen Sie Aufrufe von Clients, die Auth0 verwenden:

  1. Fügen Sie Folgendes in Ihre @Api- oder Methoden-Annotation ein:

    • Fügen Sie der Annotation einen authenticators-Parameter an, der auf den Wert {EspAuthenticator.class} festgelegt ist.
    • Fügen Sie einen issuers-Parameter hinzu, der einen @ApiIssuer enthält, der auf Auth0 gesetzt wurde.
    • Fügen Sie einen issuerAudiences-Parameter hinzu und stellen Sie @ApiIssuerAudience auf Auth0 und Ihre Auth0-Client-ID ein.

    Beispiel:

    @Api(
        name = "YOUR_API_NAME",
        version = "VERSION_NUMBER",
        authenticators = {EspAuthenticator.class},
        issuers = {
            @ApiIssuer(
                name = "auth0",
                issuer = "https://YOUR_ACCOUNT_NAME.auth0.com/",
                jwksUri = "https://YOUR_ACCOUNT_NAME.auth0.com/.well-known/jwks.json")
         },
         issuerAudiences = {
             @ApiIssuerAudience(name = "auth0", audiences = "AUTH0_CLIENT_ID")
        })
    
    • Ersetzen Sie YOUR_API_NAME durch den Namen der API.
    • Ersetzen Sie VERSION_NUMBER durch Ihre API-Version, z. B. v1.
    • Ersetzen Sie YOUR_ACCOUNT_NAME durch den für den Client verwendeten Auth0-Kontonamen.
    • Ersetzen Sie AUTH0_CLIENT_ID durch die ID, die Sie für Ihren Client verwenden möchten.
  2. Importieren Sie Users in den API-Implementierungscode:

    import com.google.api.server.spi.auth.common.User;
    
  3. Prüfen Sie in jeder API-Methode, mit der Sie eine ordnungsgemäße Authentifizierung gewährleisten möchten, ob ein gültiger User vorhanden ist. Wenn dies nicht der Fall ist, geben Sie, wie in der folgenden Methodendefinition beispielhaft gezeigt, eine Ausnahme zurück:

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  4. Stellen Sie die API noch einmal bereit, wenn Sie neue Clients hinzufügen.

Auth0-Authentifizierung einem Client hinzufügen

Sie können Ihren Code um die Auth0-Authentifizierung erweitern, wie in der Auth0-Dokumentation beschrieben. Der Client muss in der Auth0-Ausstellerkonfiguration der API aufgeführt sein.

Mit Google-ID-Tokens authentifizieren

So unterstützen Sie Aufrufe von Clients, die für die Authentifizierung Google-ID-Tokens verwenden:

  1. Fordern Sie für jede Clientanwendung eine OAuth 2-Client-ID an. Der Kunde Anwendungsinhaber muss die Client-ID über die Google Cloud Console generieren. Anweisungen finden Sie unter Client-IDs erstellen.

  2. Fügen Sie Ihrer @Api-Annotation einen clientIds-Eintrag mit der Client-ID für jede zugriffsberechtigte Clientanwendung und einen audiences-Eintrag für jeden Android-Client hinzu.

    Beispiel:

    @Api(
       name = "YOUR_API_NAME",
       version = "VERSION_NUMBER",
       clientIds = {"YOUR_CLIENT_ID"},
       audiences = {"YOUR_CLIENT_ID"}
    )
    
    • Ersetzen Sie YOUR_API_NAME durch den Namen der API.
    • Ersetzen Sie VERSION_NUMBER durch Ihre API-Version, z. B. v1.
    • Ersetzen Sie YOUR_CLIENT_ID durch die OAuth2-Client-ID, die im Clientanwendungsprojekt generiert wurde.
  3. Importieren Sie Users in den API-Implementierungscode:

    import com.google.api.server.spi.auth.common.User;
    
  4. Prüfen Sie in jeder API-Methode, mit der Sie eine ordnungsgemäße Authentifizierung gewährleisten möchten, ob ein gültiger User vorhanden ist. Wenn dies nicht der Fall ist, geben Sie, wie in der folgenden Methodendefinition beispielhaft gezeigt, eine Ausnahme aus:

    @ApiMethod(httpMethod = ApiMethod.HttpMethod.GET)
    public Email getUserEmail(User user) throws UnauthorizedException {
      if (user == null) {
        throw new UnauthorizedException("Invalid credentials");
      }
    
      Email response = new Email();
      response.setEmail(user.getEmail());
      return response;
    }
    
  5. Stellen Sie die API noch einmal bereit, wenn Sie neue Clients hinzufügen.

Google-ID-Tokenauthentifizierung einem Client hinzufügen

Informationen zum Einfügen von Authentifizierungscode in Clients finden Sie unter:

JWT im Client senden

Wenn Sie in Ihrem Client ein JWT verwenden, um authentifizierte Anfragen an die API zu senden, muss das JWT im Autorisierungsheader einer HTTP-Anfrage enthalten sein. Das JWT sollte folgende erforderliche Anforderungen haben:

  • iss
  • sub
  • aud
  • iat
  • exp

Nächste Schritte

Hintergrundinformationen zur Nutzerauthentifizierung und zum Unterschied zur API-Schlüsselautorisierung finden Sie unter API-Schlüssel effizient nutzen.