- Android
- コルドバ
- iOS
- ウィンドウズ
- Xamarin.Android
- Xamarin.Forms
- Xamarin.iOS
概要
このチュートリアルでは、サポートされている ID プロバイダーを使用して、Android の todolist クイック スタート プロジェクトに認証を追加します。 このチュートリアルは、「Mobile Apps の使用を開始する」 に基づいています。このチュートリアルは、最初に完了する必要があります。
認証用にアプリを登録し、Azure App Service を構成する
まず、ID プロバイダーのサイトでアプリを登録する必要があります。次に、Mobile Apps バックエンドでプロバイダーによって生成された資格情報を設定します。
プロバイダー固有の手順に従って、優先 ID プロバイダーを構成します。
アプリでサポートするプロバイダーごとに、前の手順を繰り返します。
許可された外部リダイレクト URL にアプリを追加する
セキュリティで保護された認証では、アプリの新しい URL スキームを定義する必要があります。 これにより、認証プロセスが完了すると、認証システムはアプリにリダイレクトし直すことができます。 このチュートリアルでは、appname のURLスキームを全体にわたって使用します。 ただし、選択した任意の URL スキームを使用できます。 モバイル アプリケーションに固有である必要があります。 サーバー側でリダイレクトを有効にするには:
Azure portalで、App Service を選択します。
認証/承認 メニュー オプションをクリックします。
許可された外部リダイレクト URLに、「
appname://easyauth.callback
」と入力します。 この文字列の appname は、モバイル アプリケーションの URL スキームです。 プロトコルの通常の URL 仕様に従う必要があります (文字と数字のみを使用し、文字で始めます)。 複数の場所で URL スキームを使用してモバイル アプリケーション コードを調整する必要がある場合は、選択した文字列を書き留める必要があります。OK をクリックします。
[保存] をクリックします。
認証されたユーザーにアクセス許可を制限する
既定では、Mobile Apps バックエンドの API は匿名で呼び出すことができます。 次に、認証されたクライアントのみにアクセスを制限する必要があります。
バックエンド Node.js (Azure portal 経由):
Mobile Apps の設定で、[簡単なテーブル] クリックし、テーブルを選択します。 [アクセス許可 変更] をクリックし、すべてのアクセス許可 [認証済みアクセスのみ] を選択し、[の保存]クリックします。
.NET バックエンド (C#) :
サーバー プロジェクトで、Controllers>TodoItemController.csに移動します。 次のように、
[Authorize]
クラスに 属性を追加します。 特定のメソッドにのみアクセスを制限するには、クラスではなく、これらのメソッドにのみこの属性を適用することもできます。 サーバープロジェクトを再公開します。[Authorize] public class TodoItemController : TableController<TodoItem>
バックエンド Node.js (Node.js コード経由):
テーブル アクセスの認証を要求するには、Node.js サーバー スクリプトに次の行を追加します。
table.access = 'authenticated';
詳細については、「方法:テーブルへのアクセスに認証を要求する」を参照してください。 サイトからクイック スタート コード プロジェクトをダウンロードする方法については、「方法: Gitを使用して Node.js バックエンド クイックスタート コード プロジェクトをダウンロードする」を参照してください。
Android Studio で、チュートリアルで完了したプロジェクトを開きます Mobile Appsの使用を開始します。 [実行] メニューから [アプリの実行] をクリックし、アプリ起動後に状態コード401(Unauthorized)を含むハンドルされない例外が発生することを確認してください。
この例外は、アプリが認証されていないユーザーとしてバックエンドへのアクセスを試みるが、TodoItem テーブルで認証が必要になったことが原因で発生します。
次に、Mobile Apps バックエンドにリソースを要求する前に、ユーザーを認証するようにアプリを更新します。
アプリに認証を追加する
Android Studio でプロジェクトを開きます。
Android Studio Project Explorer で、
ToDoActivity.java
ファイルを開き、次の import ステートメントを追加します。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;
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"); } } } }
このコードは、Google 認証プロセスを処理するメソッドを作成します。 ダイアログには、認証されたユーザーの ID が表示されます。 成功した認証でのみ続行できます。
注
Google 以外の ID プロバイダーを使用している場合は、ログイン メソッドに渡される値を、MicrosoftAccount、Facebook、Twitter、または windowsazureactivedirectory のいずれかの値に変更します。
onCreate メソッドで、
MobileServiceClient
オブジェクトをインスタンス化するコードの後に次のコード行を追加します。authenticate();
この呼び出しにより、認証プロセスが開始されます。
authenticate();
メソッドで した後、残りのコードを新しい 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(); }
リダイレクトが期待どおりに動作するようにするには、次の
RedirectUrlActivity
スニペットを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>
Android アプリケーションの
redirectUriScheme
にbuild.gradle
を追加します。android { buildTypes { release { // ... manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback'] } debug { // ... manifestPlaceholders = ['redirectUriScheme': '{url_scheme_of_your_app}://easyauth.callback'] } } }
com.android.support:customtabs:23.0.1
の依存関係にbuild.gradle
を追加します。dependencies { // ... compile 'com.android.support:customtabs:23.0.1' }
[実行] メニュー [アプリ の実行] をクリックしてアプリを起動し、選択した ID プロバイダーでサインインします。
警告
前述の URL スキームでは、大文字と小文字が区別されます。
{url_scheme_of_you_app}
のすべての出現箇所で同じケースが使用されていることを確認します。
正常にサインインすると、アプリはエラーなしで実行され、バックエンド サービスに対してクエリを実行し、データを更新できるようになります。
クライアントで認証トークンをキャッシュする
前の例では、標準のサインインを示しました。このサインインでは、アプリが起動するたびにクライアントが ID プロバイダーとバックエンド Azure サービスの両方に接続する必要があります。 この方法は非効率的であり、多くのユーザーがアプリを同時に起動しようとすると、使用状況に関連する問題が発生する可能性があります。 より良い方法は、Azure サービスによって返される承認トークンをキャッシュし、プロバイダーベースのサインインを使用する前に最初にこれを使用することです。
注
クライアントマネージド認証とサービスマネージド認証のどちらを使用しているかに関係なく、バックエンド Azure サービスによって発行されたトークンをキャッシュできます。 このチュートリアルでは、サービス管理認証を使用します。
ToDoActivity.java ファイルを開き、次の import ステートメントを追加します。
import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor;
ToDoActivity
クラスに次のメンバーを追加します。public static final String SHAREDPREFFILE = "temp"; public static final String USERIDPREF = "uid"; public static final String TOKENPREF = "tkn";
ToDoActivity.java ファイルで、
cacheUserToken
メソッドの次の定義を追加します。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 とトークンを、プライベートとしてマークされた基本設定ファイルに格納します。 これにより、デバイス上の他のアプリがトークンにアクセスできないように、キャッシュへのアクセスが保護されます。 ユーザー設定は、アプリに対してサンドボックス化されます。 ただし、デバイスにアクセスできるユーザーがいる場合は、他の方法でトークン キャッシュにアクセスできる可能性があります。
注
データへのトークン アクセスが機密性の高いと見なされ、誰かがデバイスにアクセスできる可能性がある場合は、暗号化を使用してトークンをさらに保護できます。 ただし、完全にセキュリティで保護されたソリューションは、このチュートリアルの範囲外であり、セキュリティ要件によって異なります。
ToDoActivity.java ファイルで、
loadUserTokenCache
メソッドの次の定義を追加します。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; }
ToDoActivity.java ファイルで、
authenticate
メソッドとonActivityResult
メソッドを、トークン キャッシュを使用する次のメソッドに置き換えます。 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"); } } } }
アプリをビルドし、有効なアカウントを使用して認証をテストします。 少なくとも 2 回実行します。 最初の実行時に、サインインしてトークン キャッシュを作成するように求めるメッセージが表示されます。 その後、各実行で認証用のトークン キャッシュの読み込みが試みられます。 サインインする必要はありません。
次のステップ
この基本認証チュートリアルを完了したので、次のいずれかのチュートリアルに進んでください。
- Android アプリのにプッシュ通知を追加します。 Azure 通知ハブを使用してプッシュ通知を送信するように Mobile Apps バックエンドを構成する方法について説明します。
- Android アプリのオフライン同期を有効にします。 Mobile Apps バックエンドを使用してアプリにオフライン サポートを追加する方法について説明します。 オフライン同期を使用すると、ユーザーは、ネットワーク接続がない場合でも、モバイル アプリ (データの表示、追加、変更) を操作できます。