Verificatie toevoegen aan uw Android-app

Samenvatting

In deze zelfstudie voegt u verificatie toe aan het snelstartproject todolist op Android met behulp van een ondersteunde id-provider. Deze zelfstudie is gebaseerd op de Aan de slag met Mobile Apps zelfstudie, die u eerst moet voltooien.

Registreer uw app voor verificatie en configureer Azure App Service

Eerst moet u uw app registreren op de site van een id-provider en vervolgens stelt u de door de provider gegenereerde referenties in de back-end Mobile Apps in.

  1. Configureer uw voorkeurs-id-provider door de providerspecifieke instructies te volgen:

  2. Herhaal de vorige stappen voor elke provider die u in uw app wilt ondersteunen.

Uw app toevoegen aan de toegestane URL's voor externe omleiding

Voor beveiligde verificatie moet u een nieuw URL-schema voor uw app definiëren. Hierdoor kan het verificatiesysteem terugleiden naar uw app zodra het verificatieproces is voltooid. In deze zelfstudie gebruiken we overal de app-naam van het URL-schema . U kunt echter elk URL-schema gebruiken dat u kiest. Deze moet uniek zijn voor uw mobiele toepassing. De omleiding aan de serverzijde inschakelen:

  1. Selecteer uw Azure Portal in de App Service.

  2. Klik op de menuoptie Verificatie/ autorisatie.

  3. Voer in de toegestane URL's voor externe omleiding in appname://easyauth.callback. De app-naam in deze tekenreeks is het URL-schema voor uw mobiele toepassing. Deze moet de normale URL-specificatie voor een protocol volgen (gebruik alleen letters en cijfers en begin met een letter). Noteer de tekenreeks die u kiest. U moet de code van uw mobiele toepassing op verschillende plaatsen aanpassen met het URL-schema.

  4. Klik op OK.

  5. Klik op Opslaan.

Machtigingen beperken voor geverifieerde gebruikers

STANDAARD kunnen API's in een Mobile Apps back-end anoniem worden aangeroepen. Vervolgens moet u de toegang beperken tot alleen geverifieerde clients.

  • Node.js back-end (via de Azure Portal) :

    Klik in Mobile Apps instellingen op Eenvoudige tabellen en selecteer uw tabel. Klik op Machtigingen wijzigen, selecteer Alleen geverifieerde toegang voor alle machtigingen en klik vervolgens op Opslaan.

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

    Navigeer in het serverproject naar ControllersTodoItemController.cs>. Voeg het [Authorize] kenmerk als volgt toe aan de klasse TodoItemController . Als u de toegang alleen wilt beperken tot specifieke methoden, kunt u dit kenmerk ook alleen toepassen op die methoden in plaats van op de klasse . Het serverproject opnieuw publiceren.

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js back-Node.js (via Node.js code) :

    Als u verificatie wilt vereisen voor toegang tot de tabel, voegt u de volgende regel toe aan Node.js serverscript:

      table.access = 'authenticated';
    

    Zie How to: Require authentication for access to tables (Verificatie vereisen voor toegang tot tabellen) voor meer informatie. Zie How to: Download the Node.js backend quickstart code project using Git (Het snelstartcodeproject voor de back-Node.js downloaden met Behulp van Git) voor meer informatie over het downloaden van het quickstart-codeproject van uw site.

  • Open Android Studio het project dat u hebt voltooid met de zelfstudie Aan de slag met Mobile Apps. Klik in het menu Uitvoeren op App uitvoeren en controleer of er een onverhandelde uitzondering met de statuscode 401 (Niet geautoriseerd) wordt weergegeven nadat de app is gestart.

    Deze uitzondering tkomt op omdat de app toegang probeert te krijgen tot de back-end als een niet-geauthenticeerde gebruiker, maar de todoItem-tabel nu verificatie vereist.

Vervolgens gaat u de app bijwerken om gebruikers te verifiëren voordat u resources aanvraagt bij Mobile Apps back-end.

Verificatie toevoegen aan de app

  1. Open het project in Android Studio.

  2. Open Project Explorer in Android Studio het ToDoActivity.java bestand en voeg de volgende importinspraken toe:

    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. Voeg de volgende methode toe aan de klasse ToDoActivity :

    // 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");
                }
            }
        }
    }
    

    Met deze code maakt u een methode voor het afhandelen van het Google-verificatieproces. In een dialoogvenster wordt de id van de geverifieerde gebruiker weergegeven. U kunt alleen doorgaan met een geslaagde verificatie.

    Notitie

    Als u een andere id-provider dan Google gebruikt, wijzigt u de waarde die is doorgegeven aan de aanmeldingsmethode in een van de volgende waarden: MicrosoftAccount, Facebook, Twitter of windowsazureactivedirectory.

  4. Voeg in de methode onCreate de volgende regel code toe na de code waarmee het object wordt MobileServiceClient gemaakt.

    authenticate();
    

    Met deze aanroep wordt het verificatieproces gestart.

  5. Verplaats de resterende code na authenticate(); in de methode onCreate naar een nieuwe methode createTable :

    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. Om ervoor te zorgen dat de omleiding werkt zoals verwacht, voegt u het volgende fragment van toe RedirectUrlActivity aan 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. Voeg toe redirectUriScheme aan build.gradle van uw Android-toepassing.

    android {
        buildTypes {
            release {
                // ...
                manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback']
            }
            debug {
                // ...
                manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback']
            }
        }
    }
    
  8. Voeg com.android.support:customtabs:23.0.1 toe aan de afhankelijkheden in uw build.gradle:

    dependencies {
        // ...
        compile 'com.android.support:customtabs:23.0.1'
    }
    
  9. Klik in het menu Uitvoeren op App uitvoeren om de app te starten en meld u aan met de door u gekozen id-provider.

Waarschuwing

Het vermelde URL-schema is casegevoelig. Zorg ervoor dat alle exemplaren {url_scheme_of_you_app} van dezelfde case gebruiken.

Wanneer u bent aangemeld, wordt de app zonder fouten uitgevoerd en moet u een query kunnen uitvoeren op de back-endservice en gegevens kunnen bewerken.

Verificatietokens in de cache op de client

In het vorige voorbeeld werd een standaard aanmelding getoond, waarvoor de client telkens wanneer de app wordt gestart contact moet opnemen met zowel de id-provider als de back-end-Azure-service. Deze methode is inefficiënt en u kunt problemen met betrekking tot gebruik hebben als veel klanten proberen uw app tegelijkertijd te starten. Een betere benadering is om het autorisatie-token dat is geretourneerd door de Azure-service in de cache op te nemen en dit eerst te proberen te gebruiken voordat u een aanmelding op basis van een provider gebruikt.

Notitie

U kunt het token dat is uitgegeven door de back-end-Azure-service, in de cache cachen, ongeacht of u door de client beheerde of door de service beheerde verificatie gebruikt. In deze zelfstudie wordt gebruikgemaakt van door de service beheerde verificatie.

  1. Open het bestand ToDoActivity.java en voeg de volgende importin instructies toe:

    import android.content.Context;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    
  2. Voeg de volgende leden toe aan de ToDoActivity klasse .

    public static final String SHAREDPREFFILE = "temp";
    public static final String USERIDPREF = "uid";
    public static final String TOKENPREF = "tkn";
    
  3. Voeg in het bestand ToDoActivity.java de volgende definitie toe voor de cacheUserToken methode .

    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();
    }
    

    Met deze methode worden de gebruikers-id en het token opgeslagen in een voorkeursbestand dat als privé is gemarkeerd. Hiermee moet de toegang tot de cache worden beschermd, zodat andere apps op het apparaat geen toegang hebben tot het token. De voorkeur is sandboxed voor de app. Als iemand echter toegang krijgt tot het apparaat, is het mogelijk dat hij of zij via een andere manier toegang krijgt tot de tokencache.

    Notitie

    U kunt het token verder beveiligen met versleuteling, als tokentoegang tot uw gegevens als zeer gevoelig wordt beschouwd en iemand toegang kan krijgen tot het apparaat. Een volledig veilige oplossing valt echter buiten het bereik van deze zelfstudie en is afhankelijk van uw beveiligingsvereisten.

  4. Voeg in het bestand ToDoActivity.java de volgende definitie toe voor de loadUserTokenCache methode .

    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. Vervang in het bestand ToDoActivity.java de authenticate methoden en onActivityResult door de volgende methoden, die een tokencache gebruiken. Wijzig de aanmeldingsprovider als u een ander account dan Google wilt gebruiken.

    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. Bouw de app en test de verificatie met een geldig account. Voer deze minstens twee keer uit. Tijdens de eerste run ontvangt u een prompt om u aan te melden en de tokencache te maken. Daarna probeert elke run de tokencache te laden voor verificatie. U bent niet verplicht om u aan te melden.

Volgende stappen

Nu u deze basisverificatiezelfstudie hebt voltooid, kunt u doorgaan met een van de volgende zelfstudies:

  • Voeg pushmeldingen toe aan uw Android-app. Meer informatie over het configureren van Mobile Apps back-end om Azure Notification Hubs te gebruiken voor het verzenden van pushmeldingen.
  • Schakel offlinesynchronisatie in voor uw Android-app. Meer informatie over het toevoegen van offlineondersteuning aan uw app met behulp van Mobile Apps back-end. Met offlinesynchronisatie kunnen gebruikers communiceren met een mobiele app, zoals het weergeven, toevoegen of wijzigen van gegevens, zelfs wanneer er geen netwerkverbinding is.