Android アプリに認証を追加するAdd authentication to your Android app

注意

Visual Studio App Center では、モバイル アプリ開発の中心となる新しい統合サービスに投資しています。Visual Studio App Center is investing in new and integrated services central to mobile app development. 開発者は、ビルドテスト配布のサービスを使用して、継続的インテグレーションおよびデリバリー パイプラインを設定できます。Developers can use Build, Test and Distribute services to set up Continuous Integration and Delivery pipeline. アプリがデプロイされたら、開発者は分析および診断のサービスを利用してアプリの状態と使用状況を監視し、プッシュ サービスを利用してユーザーとかかわることができます。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. また、開発者は Auth を利用してユーザーを認証し、データ サービスを利用してクラウド内のアプリ データを保持および同期することもできます。Developers can also leverage Auth to authenticate their users and Data service to persist and sync app data in the cloud. App Center を今すぐチェックしてください。Check out App Center today.

まとめSummary

このチュートリアルでは、サポートされている ID プロバイダーを使用して、Android で todolist クイック スタート プロジェクトに認証を追加します。In this tutorial, you add authentication to the todolist quickstart project on Android by using a supported identity provider. 最初に、このチュートリアルの基になっている Mobile Apps の使用 チュートリアルを完了しておく必要があります。This tutorial is based on the Get started with Mobile Apps tutorial, which you must complete first.

アプリを認証に登録し、Azure App Services を構成するRegister your app for authentication and configure Azure App Service

最初に、ID プロバイダーのサイトでアプリを登録する必要があります。その後、プロバイダーによって生成された資格情報を Mobile Apps バックエンドに設定します。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. 次のプロバイダー固有の指示に従い、任意の ID プロバイダーを構成します。Configure your preferred identity provider by following the provider-specific instructions:

  2. アプリ内でサポートするプロバイダーごとに、前の手順を繰り返します。Repeat the previous steps for each provider you want to support in your app.

許可されている外部リダイレクト URL にアプリを追加するAdd your app to the Allowed External Redirect URLs

認証をセキュリティで保護するには、アプリ用の新しい URL スキームの定義が必要になります。Secure authentication requires that you define a new URL scheme for your app. これによって、認証プロセスが完了すると認証システムからアプリにリダイレクトできます。This allows the authentication system to redirect back to your app once the authentication process is complete. このチュートリアル全体を通して、URL スキーム appname を使用します。In this tutorial, we use the URL scheme appname throughout. ただし、選択したあらゆる URL スキームを使用できます。However, you can use any URL scheme you choose. URL スキームは、モバイル アプリに対して一意である必要があります。It should be unique to your mobile application. サーバー側でリダイレクトを有効にするには、以下の手順に従います。To enable the redirection on the server side:

  1. Azure Portal で、App Service を選択します。In the Azure portal, select your App Service.

  2. [認証/承認] メニュー オプションをクリックします。Click the Authentication / Authorization menu option.

  3. [Allowed External Redirect URLs (許可されている外部リダイレクト URL)]appname://easyauth.callback を入力します。In the Allowed External Redirect URLs, enter appname://easyauth.callback. この文字列の appname は、モバイル アプリケーションの URL スキームです。The appname in this string is the URL Scheme for your mobile application. プロトコルの通常の URL 仕様 (文字と数字のみを使用し、文字で始まる) に従う必要があります。It should follow normal URL specification for a protocol (use letters and numbers only, and start with a letter). 数か所で URL スキームに合わせてモバイル アプリケーション コードを調整する必要があるため、選択した文字列をメモしておく必要があります。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. Click OK.Click OK.

  5. [Save] をクリックします。Click Save.

アクセス許可を、認証されたユーザーだけに制限するRestrict permissions to authenticated users

既定では、Mobile Apps バックエンドの API は匿名で呼び出すことができます。By default, APIs in a Mobile Apps back end can be invoked anonymously. 次に、認証されたクライアントのみにアクセスを制限する必要があります。Next, you need to restrict access to only authenticated clients.

  • Node.js バックエンド (Azure Portal 経由) :Node.js back end (via the Azure portal) :

    Mobile Apps の設定で [Easy Tables] をクリックし、目的のテーブルを選択します。In your Mobile Apps settings, click Easy Tables and select your table. [アクセス許可の変更] をクリックし、すべてのアクセス許可に対して [Authenticated access only (認証済みアクセスのみ)] を選択し、 [保存] をクリックします。Click Change permissions, select Authenticated access only for all permissions, and then click Save.

  • .NET バックエンド (C#) :.NET back end (C#):

    サーバー プロジェクトで、 [コントローラー] > [TodoItemController.cs] の順に移動します。In the server project, navigate to Controllers > TodoItemController.cs. 次のように、 [Authorize] 属性を TodoItemController クラスに追加します。Add the [Authorize] attribute to the TodoItemController class, as follows. アクセスを特定のメソッドのみに制限するには、この属性を、クラスではなく、そのメソッドのみに適用するだけです。To restrict access only to specific methods, you can also apply this attribute just to those methods instead of the class. サーバー プロジェクトを発行します。Republish the server project.

      [Authorize]
      public class TodoItemController : TableController<TodoItem>
    
  • Node.js バックエンド (Node.js コード経由) :Node.js backend (via Node.js code) :

    テーブルへのアクセスに対して認証を要求するには、Node.js サーバー スクリプトに次の行を追加します。To require authentication for table access, add the following line to the Node.js server script:

      table.access = 'authenticated';
    

    詳細については、「方法:テーブルへのアクセスに認証を要求する」を参照してください。For more details, see How to: Require authentication for access to tables. サイトからクイック スタート コード プロジェクトをダウンロードするには、「方法:Git を使用して Node.js バックエンド クイック スタート コード プロジェクトをダウンロードする」を参照してください。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.

  • Android Studio で、Mobile Apps の使用に関するチュートリアルで完成させたプロジェクトを開きます。In Android Studio, open the project you completed with the tutorial Get started with Mobile Apps. [Run (実行)] メニューの [Run app (アプリの実行)] をクリックし、アプリの開始後に、状態コード 401 (許可されていません) のハンドルされない例外が発生することを確認します。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.

    この例外は、認証されないユーザーとしてアプリがバックエンドにアクセスしようとしても、TodoItem テーブルでは認証が要求されるために発生します。This exception happens because the app attempts to access the back end as an unauthenticated user, but the TodoItem table now requires authentication.

次に、Mobile Apps バックエンドのリソースを要求する前にユーザーを認証するようにアプリを更新します。Next, you update the app to authenticate users before requesting resources from the Mobile Apps back end.

アプリケーションに認証を追加するAdd authentication to the app

  1. Android Studio でプロジェクトを開きます。Open the project in Android Studio.

  2. Android Studio の Project ExplorerToDoActivity.java ファイルを開き、次の import ステートメントを追加します。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. ToDoActivity クラスに次のメソッドを追加します。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");
                }
            }
        }
    }
    

    このコードで、Google 認証プロセスを処理するメソッドが作成されます。This code creates a method to handle the Google authentication process. ダイアログに認証されたユーザーの ID が表示されます。A dialog displays the ID of the authenticated user. 認証に成功した場合のみ続行できます。You can only proceed on a successful authentication.

    注意

    Google 以外の ID プロバイダーを使用している場合は、login メソッドに渡される値を次のいずれかの値に変更します。MicrosoftAccountFacebookTwitter、または windowsazureactivedirectoryIf 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. onCreate メソッドで、MobileServiceClient オブジェクトをインスタンス化するコードの後に、次のコード行を追加します。In the onCreate method, add the following line of code after the code that instantiates the MobileServiceClient object.

    authenticate();
    

    この呼び出しで、認証プロセスが開始されます。This call starts the authentication process.

  5. onCreate メソッド内の authenticate(); の後の残りのコードを新しい createTable メソッドに移動します。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. リダイレクトが適切に機能するように、次に示す RedirectUrlActivity のスニペットを AndroidManifest.xml に追加します。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. redirectUriScheme を Android アプリケーションの build.gradle に追加します。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. com.android.support:customtabs:23.0.1build.gradle の依存関係に追加します。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. [Run (実行)] メニューの [Run app (アプリの実行)] をクリックしてアプリを開始し、選択した ID プロバイダーでサインインします。From the Run menu, click Run app to start the app and sign in with your chosen identity provider.

警告

記載されている URL スキームは、大文字と小文字が区別されます。The URL Scheme mentioned is case-sensitive. {url_scheme_of_you_app} のすべての出現箇所で大文字と小文字を同じように使用してください。Ensure that all occurrences of {url_scheme_of_you_app} use the same case.

サインインに成功すると、アプリはエラーなしで実行されます。また、バックエンド サービスにクエリを実行したり、データを更新したりできるようになります。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.

クライアントに認証トークンをキャッシュするCache authentication tokens on the client

前の例では、標準のサインインを示しました。標準のサインインでは、アプリケーションが開始されるたびに、クライアントは ID プロバイダーとバックエンド Azure サービスの両方にアクセスする必要があります。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. この方法は非効率であり、多くの顧客が同時にアプリケーションを開始しようとした場合に使用率に関連する問題が発生する場合があります。This method is inefficient, and you can have usage-related issues if many customers try to start your app simultaneously. よって、Azure サービスから返される承認トークンをキャッシュし、最初にその承認トークンの使用を試してから、プロバイダー ベースのサインインを使用する方が効果的です。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.

注意

クライアントによって管理される認証とサービスによって管理される認証のどちらを使用する場合でも、バックエンド Azure サービスが発行したトークンをキャッシュできます。You can cache the token issued by the back-end Azure service regardless of whether you are using client-managed or service-managed authentication. このチュートリアルでは、サービスによって管理される認証を使用します。This tutorial uses service-managed authentication.

  1. ToDoActivity.java ファイルを開き、次の import ステートメントを追加します。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. 次のメンバーをクラス ToDoActivity クラスに追加します。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. ToDoActivity.java ファイル内で、次の cacheUserToken メソッドの定義を追加します。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();
    }
    

    このメソッドでは、プライベートとマークされた設定ファイルに、ユーザー ID とトークンを格納します。This method stores the user ID and token in a preference file that is marked private. これにより、キャッシュへのアクセスが保護され、デバイスの他のアプリケーションはトークンにアクセスできなくなります。This should protect access to the cache so that other apps on the device do not have access to the token. 設定は、アプリケーション用にサンドボックス化されます。The preference is sandboxed for the app. ただし、他のユーザーは、デバイスにアクセスできるようになると、他の手段によってトークン キャッシュにアクセスできる可能性があります。However, if someone gains access to the device, it is possible that they may gain access to the token cache through other means.

    注意

    トークンによるデータへのアクセスの秘密性が高く、他のユーザーがそのデバイスにアクセスする可能性がある場合は、暗号化によりトークンの保護を強化できます。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. ただし、完全に安全なソリューションはこのチュートリアルの範囲を超えており、またセキュリティの要件によって異なります。A completely secure solution is beyond the scope of this tutorial, however, and depends on your security requirements.

  4. ToDoActivity.java ファイル内で、次の loadUserTokenCache メソッドの定義を追加します。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. ToDoActivity.java ファイルで、authenticate メソッドと onActivityResult メソッドを、トークン キャッシュを使う次のメソッドに置き換えます。In the ToDoActivity.java file, replace the authenticate and onActivityResult methods with the following ones, which uses a token cache. Google 以外のアカウントを使用する場合は、ログイン プロバイダーを変更します。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. アプリケーションをビルドし、有効なアカウントを使用して認証をテストします。Build the app and test authentication using a valid account. 最低 2 回アプリケーションを実行します。Run it at least twice. 最初の実行で、サインインとトークン キャッシュの作成を求めるプロンプトが表示されます。During the first run, you should receive a prompt to sign in and create the token cache. それ以降、実行ごとに、認証のためのトークン キャッシュの読み込みが試行されます。After that, each run attempts to load the token cache for authentication. サインインする必要がなくなります。You should not be required to sign in.

次の手順Next steps

これで基本的な認証チュートリアルは完了しましたので、引き続き次のいずれかのチュートリアルのご利用を検討してください。Now that you completed this basic authentication tutorial, consider continuing on to one of the following tutorials:

  • プッシュ通知を Android アプリに追加するAdd push notifications to your Android app. Azure Notification Hubs を使用してプッシュ通知を送信するように Mobile Apps バックエンドを構成する方法について説明します。Learn how to configure your Mobile Apps back end to use Azure notification hubs to send push notifications.
  • Android アプリのオフライン同期を有効にするEnable offline sync for your Android app. Mobile Apps バックエンドを使用してオフライン サポートをアプリに追加する方法について説明します。Learn how to add offline support to your app by using a Mobile Apps back end. オフライン同期を使用すると、ユーザーはネットワークにアクセスできなくても、データの表示、追加、変更など、モバイル アプリケーションとやり取りできます。With offline sync, users can interact with a mobile app—viewing, adding, or modifying data—even when there is no network connection.