Hinzufügen der Authentifizierung zu Ihrer Android-AppAdd authentication to your Android app

Hinweis

Visual Studio App Center unterstützt End-to-End- und integrierte Dienste, die für die Entwicklung mobiler Apps von zentraler Bedeutung sind.Visual Studio App Center supports end to end and integrated services central to mobile app development. Entwickler können Build-, Test- und Verteilungsdienste nutzen, um eine Pipeline für Continuous Integration und Delivery einzurichten.Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. Nach der Bereitstellung der App können Entwickler den Status und die Nutzung ihrer App mithilfe der Analyse- und Diagnosedienste überwachen und mit Benutzern über den Pushdienst interagieren.Once the app is deployed, developers can monitor the status and usage of their app using the Analytics and Diagnostics services, and engage with users using the Push service. Entwickler können auch den Authentifizierungsdienst nutzen, um ihre Benutzer zu authentifizieren, und den Datendienst, um App-Daten dauerhaft in der Cloud zu speichern und zu synchronisieren.Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud.

Falls Sie Clouddienste in Ihre mobile Anwendung integrieren möchten, sollten Sie sich noch heute für App Center registrieren.If you are looking to integrate cloud services in your mobile application, sign up with App Center today.

ZusammenfassungSummary

In diesem Tutorial verwenden Sie einen unterstützten Identitätsanbieter, um dem Aufgabenlisten-Schnellstartprojekt unter Android eine Authentifizierung hinzuzufügen.In this tutorial, you add authentication to the todolist quickstart project on Android by using a supported identity provider. Dieses Tutorial baut auf dem Tutorial Erste Schritte mit mobilen Apps auf, das Sie zuerst abschließen müssen.This tutorial is based on the Get started with Mobile Apps tutorial, which you must complete first.

Registrieren Ihrer App für die Authentifizierung und Konfigurieren von Azure App ServiceRegister your app for authentication and configure Azure App Service

Zuerst müssen Sie Ihre App auf der Website eines Identitätsanbieters registrieren und anschließend die vom Anbieter generierten Anmeldeinformationen im Mobile Apps-Back-End festlegen.First, you need to register your app at an identity provider's site, and then you will set the provider-generated credentials in the Mobile Apps back end.

  1. Konfigurieren Sie Ihren bevorzugten Identitätsanbieter anhand der anbieterspezifischen Anweisungen:Configure your preferred identity provider by following the provider-specific instructions:

  2. Wiederholen Sie die oben stehenden Schritte für jeden Anbieter, den Sie in Ihrer App unterstützen möchten.Repeat the previous steps for each provider you want to support in your app.

Hinzufügen Ihrer App zu den zulässigen externen Umleitungs-URLsAdd your app to the Allowed External Redirect URLs

Eine sichere Authentifizierung erfordert, dass Sie ein neues URL-Schema für Ihre App definieren.Secure authentication requires that you define a new URL scheme for your app. Dies ermöglicht dem Authentifizierungssystem die erneute Umleitung an Ihre App, sobald der Authentifizierungsprozess abgeschlossen ist.This allows the authentication system to redirect back to your app once the authentication process is complete. In diesem Tutorial verwenden wir ausschließlich das URL-Schema appname.In this tutorial, we use the URL scheme appname throughout. Sie können jedoch ein beliebiges URL-Schema auswählen und verwenden.However, you can use any URL scheme you choose. Es sollte für Ihre mobile Anwendung eindeutig sein.It should be unique to your mobile application. So aktivieren Sie die Umleitung auf der ServerseiteTo enable the redirection on the server side:

  1. Wählen Sie im Azure-Portal App Service aus.In the Azure portal, select your App Service.

  2. Klicken Sie auf die Menüoption Authentifizierung/Autorisierung.Click the Authentication / Authorization menu option.

  3. Geben Sie in Zulässige externe Umleitungs-URLs appname://easyauth.callback ein.In the Allowed External Redirect URLs, enter appname://easyauth.callback. Das appname-Element in dieser Zeichenfolge ist das URL-Schema für Ihre mobile Anwendung.The appname in this string is the URL Scheme for your mobile application. Es sollte der normalen URL-Spezifikation für ein Protokoll folgen (nur aus Buchstaben und Zahlen bestehen und mit einem Buchstaben beginnen).It should follow normal URL specification for a protocol (use letters and numbers only, and start with a letter). Notieren Sie sich die gewählte Zeichenfolge, da Sie später Ihren mobilen Anwendungscode mehrfach mit dem URL-Schema anpassen müssen.You should make a note of the string that you choose as you will need to adjust your mobile application code with the URL Scheme in several places.

  4. Klicken Sie auf OK.Click OK.

  5. Klicken Sie auf Speichern.Click Save.

Einschränken von Berechtigungen für authentifizierte BenutzerRestrict permissions to authenticated users

Standardmäßig können APIs auf Mobile Apps-Back-Ends anonym aufgerufen werden.By default, APIs in a Mobile Apps back end can be invoked anonymously. Als Nächstes müssen Sie den Zugriff auf authentifizierte Clients beschränken.Next, you need to restrict access to only authenticated clients.

  • Node.js-Back-End (über das Azure-Portal):Node.js back end (via the Azure portal) :

    Klicken Sie in den Einstellungen von Mobile Apps auf Einfache Tabellen, und wählen Sie Ihre Tabelle aus.In your Mobile Apps settings, click Easy Tables and select your table. Klicken Sie auf Berechtigungen ändern, wählen Sie für alle Berechtigungen Authenticated access only (Nur authentifizierter Zugriff) aus, und klicken Sie auf Speichern.Click Change permissions, select Authenticated access only for all permissions, and then click Save.

  • .NET-Back-End (C#):.NET back end (C#):

    Navigieren Sie im Serverprojekt zu Controller > TodoItemController.cs.In the server project, navigate to Controllers > TodoItemController.cs. Fügen Sie das [Authorize]-Attribut der TodoItemController-Klasse wie folgt hinzu:Add the [Authorize] attribute to the TodoItemController class, as follows. Um den Zugriff auf bestimmte Methoden zu beschränken, können Sie dieses Attribut auch nur auf diese Methoden anstelle der Klasse anwenden.To restrict access only to specific methods, you can also apply this attribute just to those methods instead of the class. Veröffentlichen Sie das Serverprojekt erneut.Republish the server project.

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js-Back-End (über Node.js-Code) :Node.js backend (via Node.js code) :

    Um für den Zugriff auf Tabellen eine Authentifizierung anzufordern, fügen Sie die folgende Zeile in das Node.js-Serverskript ein:To require authentication for table access, add the following line to the Node.js server script:

      table.access = 'authenticated';
    

    Weitere Details finden Sie unter Gewusst wie: Erzwingen der Authentifizierung für den Zugriff auf Tabellen.For more details, see How to: Require authentication for access to tables. Informationen zum Herunterladen des Schnellstart-Codeprojekts von Ihrer Website finden Sie unter Vorgehensweise: Herunterladen des Schnellstart-Codeprojekts für das Node.js-Back-End mit Git.To learn how to download the quickstart code project from your site, see How to: Download the Node.js backend quickstart code project using Git.

  • Öffnen Sie in Android Studio das Projekt, das Sie im Tutorial Erste Schritte mit mobilen Apps erstellt haben.In Android Studio, open the project you completed with the tutorial Get started with Mobile Apps. Klicken Sie im Menü Ausführen auf App ausführen. Vergewissern Sie sich, dass nach dem Start der App ein Ausnahmefehler mit dem Statuscode 401 (nicht autorisiert) ausgelöst wird.From the Run menu, click Run app, and verify that an unhandled exception with a status code of 401 (Unauthorized) is raised after the app starts.

    Diese Ausnahme wird ausgelöst, weil die App als nicht authentifizierter Benutzer versucht, auf das Back-End zuzugreifen, aber die TodoItem-Tabelle nun eine Authentifizierung erfordert.This exception happens because the app attempts to access the back end as an unauthenticated user, but the TodoItem table now requires authentication.

Aktualisieren Sie nun die App, um Benutzer vor dem Anfordern von Ressourcen des Mobile Apps-Back-Ends zu authentifizieren.Next, you update the app to authenticate users before requesting resources from the Mobile Apps back end.

Hinzufügen von Authentifizierung zur AppAdd authentication to the app

  1. Öffnen Sie das Projekt in Android Studio.Open the project in Android Studio.

  2. Öffnen Sie die Datei ToDoActivity.java im Projektexplorer in Android Studio, und fügen Sie die folgenden Importanweisungen hinzu:In Project Explorer in Android Studio, open the ToDoActivity.java file and add the following import statements:

    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.atomic.AtomicBoolean;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    
    import com.microsoft.windowsazure.mobileservices.authentication.MobileServiceAuthenticationProvider;
    import com.microsoft.windowsazure.mobileservices.authentication.MobileServiceUser;
    
  3. Fügen Sie der ToDoActivity -Klasse die folgende Methode hinzu:Add the following method to the ToDoActivity class:

    // You can choose any unique number here to differentiate auth providers from each other. Note this is the same code at login() and onActivityResult().
    public static final int GOOGLE_LOGIN_REQUEST_CODE = 1;
    
    private void authenticate() {
        // Sign in using the Google provider.
        mClient.login(MobileServiceAuthenticationProvider.Google, "{url_scheme_of_your_app}", GOOGLE_LOGIN_REQUEST_CODE);
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // When request completes
        if (resultCode == RESULT_OK) {
            // Check the request code matches the one we send in the login request
            if (requestCode == GOOGLE_LOGIN_REQUEST_CODE) {
                MobileServiceActivityResult result = mClient.onActivityResult(data);
                if (result.isLoggedIn()) {
                    // sign-in succeeded
                    createAndShowDialog(String.format("You are now signed in - %1$2s", mClient.getCurrentUser().getUserId()), "Success");
                    createTable();
                } else {
                    // sign-in failed, check the error message
                    String errorMessage = result.getErrorMessage();
                    createAndShowDialog(errorMessage, "Error");
                }
            }
        }
    }
    

    Dieser Code erstellt eine Methode für die Verarbeitung des Google-Authentifizierungsprozesses.This code creates a method to handle the Google authentication process. Ein Dialogfeld zeigt die ID des authentifizierten Benutzers an.A dialog displays the ID of the authenticated user. Sie können den Vorgang nur bei erfolgreicher Authentifizierung fortsetzen.You can only proceed on a successful authentication.

    Hinweis

    Falls Sie einen anderen Identitätsanbieter als Google verwenden, ändern Sie den an die login-Methode übergebenen Wert in einen der folgenden Werte: MicrosoftAccount, Facebook, Twitter oder windowsazureactivedirectory.If you are using an identity provider other than Google, change the value passed to the login method to one of the following values: MicrosoftAccount, Facebook, Twitter, or windowsazureactivedirectory.

  4. Fügen Sie in der onCreate-Methode die folgende Codezeile im Anschluss an den Code hinzu, der das MobileServiceClient-Objekt instanziiert.In the onCreate method, add the following line of code after the code that instantiates the MobileServiceClient object.

    authenticate();
    

    Dieser Aufruf startet den Authentifizierungsprozess.This call starts the authentication process.

  5. Verschieben Sie den verbleibenden Code nach authenticate(); in der OnCreate-Methode in eine neue CreateTable-Methode.Move the remaining code after authenticate(); in the onCreate method to a new createTable method:

    private void createTable() {
    
        // Get the table instance to use.
        mToDoTable = mClient.getTable(ToDoItem.class);
    
        mTextNewToDo = (EditText) findViewById(R.id.textNewToDo);
    
        // Create an adapter to bind the items with the view.
        mAdapter = new ToDoItemAdapter(this, R.layout.row_list_to_do);
        ListView listViewToDo = (ListView) findViewById(R.id.listViewToDo);
        listViewToDo.setAdapter(mAdapter);
    
        // Load the items from Azure.
        refreshItemsFromTable();
    }
    
  6. Fügen Sie den folgenden Codeausschnitt von RedirectUrlActivity der Datei AndroidManifest.xml hinzu, um sicherzustellen, dass die Umleitung erwartungsgemäß funktioniert:To ensure redirection works as expected, add the following snippet of RedirectUrlActivity to AndroidManifest.xml:

    <activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="{url_scheme_of_your_app}"
                android:host="easyauth.callback"/>
        </intent-filter>
    </activity>
    
  7. Fügen Sie redirectUriScheme dem build.gradle Ihrer Android-Anwendung hinzu.Add redirectUriScheme to build.gradle of your Android application.

    android {
        buildTypes {
            release {
                // ...
                manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback']
            }
            debug {
                // ...
                manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback']
            }
        }
    }
    
  8. Fügen Sie com.android.support:customtabs:23.0.1 den Abhängigkeiten in Ihrem build.gradle hinzu:Add com.android.support:customtabs:23.0.1 to the dependencies in your build.gradle:

    dependencies {
        // ...
        compile 'com.android.support:customtabs:23.0.1'
    }
    
  9. Klicken Sie im Menü Ausführen auf App ausführen, um die App zu starten, und melden Sie sich mit dem Identitätsanbieter Ihrer Wahl an.From the Run menu, click Run app to start the app and sign in with your chosen identity provider.

Warnung

Bei dem erwähnten URL-Schema muss die Groß-/Kleinschreibung beachtet werden.The URL Scheme mentioned is case-sensitive. Stellen Sie sicher, dass alle Vorkommen von {url_scheme_of_you_app} die gleiche Groß-/Kleinschreibung verwenden.Ensure that all occurrences of {url_scheme_of_you_app} use the same case.

Nach erfolgreicher Anmeldung sollte die App ohne Fehler ausgeführt werden, und Sie sollten in der Lage sein, den Back-End-Dienst abzufragen und Daten zu aktualisieren.When you are successfully signed in, the app should run without errors, and you should be able to query the back-end service and make updates to data.

Zwischenspeichern von Authentifizierungstoken auf dem ClientCache authentication tokens on the client

Im vorhergehenden Beispiel wurde eine Standardanmeldung gezeigt, bei der der Client bei jedem Start der App sowohl den Identitätsanbieter als auch den Azure-Back-End-Dienst kontaktieren muss.The previous example showed a standard sign-in, which requires the client to contact both the identity provider and the back-end Azure service every time the app starts. Diese Methode ist allerdings ineffizient und kann zu Problemen bei der Nutzung führen, wenn viele Kunden die App gleichzeitig starten möchten.This method is inefficient, and you can have usage-related issues if many customers try to start your app simultaneously. Daher empfiehlt es sich, das vom Azure-Dienst zurückgegebene Authentifizierungstoken zwischenzuspeichern und vor einer anbieterbasierten Anmeldung zu verwenden.A better approach is to cache the authorization token returned by the Azure service, and try to use this first before using a provider-based sign-in.

Hinweis

Für die Zwischenspeicherung des vom Azure-Back-End-Dienst zurückgegebenen Authentifizierungstokens spielt es keine Rolle, ob Sie die clientverwaltete oder die dienstverwaltete Authentifizierung verwenden.You can cache the token issued by the back-end Azure service regardless of whether you are using client-managed or service-managed authentication. In diesem Lernprogramm wird die dienstverwaltete Authentifizierung verwendet.This tutorial uses service-managed authentication.

  1. Öffnen Sie die Datei "ToDoActivity.java", und fügen Sie die folgenden import-Anweisungen ein:Open the ToDoActivity.java file and add the following import statements:

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    
  2. Fügen Sie die folgenden Mitglieder zur ToDoActivity -Klasse hinzu:Add the following members to the ToDoActivity class.

    public static final String SHAREDPREFFILE = "temp";
    public static final String USERIDPREF = "uid";
    public static final String TOKENPREF = "tkn";
    
  3. Fügen Sie der Datei „ToDoActivity.java“ die folgende Definition für die cacheUserToken-Methode hinzu.In the ToDoActivity.java file, add the following definition for the cacheUserToken method.

    private void cacheUserToken(MobileServiceUser user)
    {
        SharedPreferences prefs = getSharedPreferences(SHAREDPREFFILE, Context.MODE_PRIVATE);
        Editor editor = prefs.edit();
        editor.putString(USERIDPREF, user.getUserId());
        editor.putString(TOKENPREF, user.getAuthenticationToken());
        editor.commit();
    }
    

    Diese Methode speichert die Benutzer-ID und das Token in einer als privat gekennzeichneten Einstellungsdatei.This method stores the user ID and token in a preference file that is marked private. Dadurch wird der Zugriff auf den Cache geschützt, sodass andere Apps auf dem Gerät nicht auf das Token zugreifen können.This should protect access to the cache so that other apps on the device do not have access to the token. Die Einstellung ist für die App in einer Sandbox isoliert.The preference is sandboxed for the app. Trotzdem ist es möglich, dass jemand, der Zugriff auf das Gerät erlangt hat, auf andere Weise auf den Tokencache zugreift.However, if someone gains access to the device, it is possible that they may gain access to the token cache through other means.

    Hinweis

    Falls es sich um besonders sensible Daten handelt und die Gefahr besteht, dass andere Benutzer auf das Gerät zugreifen, können Sie das Token zu seinem Schutz zusätzlich verschlüsseln.You can further protect the token with encryption, if token access to your data is considered highly sensitive and someone may gain access to the device. Eine absolut sichere Lösung geht allerdings über den Rahmen dieses Tutorial hinaus und hängt zudem von Ihren Sicherheitsanforderungen ab.A completely secure solution is beyond the scope of this tutorial, however, and depends on your security requirements.

  4. Fügen Sie der Datei „ToDoActivity.java“ die folgende Definition für die loadUserTokenCache-Methode hinzu.In the ToDoActivity.java file, add the following definition for the loadUserTokenCache method.

    private boolean loadUserTokenCache(MobileServiceClient client)
    {
        SharedPreferences prefs = getSharedPreferences(SHAREDPREFFILE, Context.MODE_PRIVATE);
        String userId = prefs.getString(USERIDPREF, null);
        if (userId == null)
            return false;
        String token = prefs.getString(TOKENPREF, null);
        if (token == null)
            return false;
    
        MobileServiceUser user = new MobileServiceUser(userId);
        user.setAuthenticationToken(token);
        client.setCurrentUser(user);
    
        return true;
    }
    
  5. Ersetzen Sie in der Datei ToDoActivity.java die Methoden authenticate und onActivityResult durch die folgenden, die einen Tokencache verwenden.In the ToDoActivity.java file, replace the authenticate and onActivityResult methods with the following ones, which uses a token cache. Wechseln Sie den Login-Anbieter, wenn Sie ein anderes Konto als Google verwenden möchten.Change the login provider if you want to use an account other than Google.

    private void authenticate() {
        // We first try to load a token cache if one exists.
        if (loadUserTokenCache(mClient))
        {
            createTable();
        }
        // If we failed to load a token cache, sign in and create a token cache
        else
        {
            // Sign in using the Google provider.
            mClient.login(MobileServiceAuthenticationProvider.Google, "{url_scheme_of_your_app}", GOOGLE_LOGIN_REQUEST_CODE);
        }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // When request completes
        if (resultCode == RESULT_OK) {
            // Check the request code matches the one we send in the sign-in request
            if (requestCode == GOOGLE_LOGIN_REQUEST_CODE) {
                MobileServiceActivityResult result = mClient.onActivityResult(data);
                if (result.isLoggedIn()) {
                    // sign-in succeeded
                    createAndShowDialog(String.format("You are now signed in - %1$2s", mClient.getCurrentUser().getUserId()), "Success");
                    cacheUserToken(mClient.getCurrentUser());
                    createTable();
                } else {
                    // sign-in failed, check the error message
                    String errorMessage = result.getErrorMessage();
                    createAndShowDialog(errorMessage, "Error");
                }
            }
        }
    }
    
  6. Erstellen Sie die App und testen Sie die Authentifizierung mit einem gültigen Konto.Build the app and test authentication using a valid account. Führen Sie sie mindestens zweimal aus.Run it at least twice. Bei der ersten Ausführung sollten Sie eine Aufforderung zur Anmeldung und Erstellung des Tokencaches erhalten.During the first run, you should receive a prompt to sign in and create the token cache. Danach wird bei jeder Ausführung versucht, den Tokencache für die Authentifizierung zu laden.After that, each run attempts to load the token cache for authentication. Nun sollte keine Anmeldung mehr erforderlich sein.You should not be required to sign in.

Nächste SchritteNext steps

Nachdem Sie dieses einfache Tutorial zur Authentifizierung abgeschlossen haben, können Sie mit den folgenden Tutorials fortfahren:Now that you completed this basic authentication tutorial, consider continuing on to one of the following tutorials: