- アンドロイド
- コルドバ
- iOS
- ウィンドウズ
- Xamarin.Android
- Xamarin.Forms
- Xamarin.iOS
概要
このトピックでは、クライアント アプリケーションから App Service Mobile App のユーザーを認証する方法について説明します。 このチュートリアルでは、App Service でサポートされている ID プロバイダーを使用して、Xamarin Forms クイック スタート プロジェクトに認証を追加します。 モバイル アプリによって正常に認証および承認されると、ユーザー ID 値が表示され、制限されたテーブル データにアクセスできるようになります。
[前提条件]
このチュートリアルで最適な結果を得る場合は、まず Xamarin Forms アプリの作成 に関するチュートリアルを完了することをお勧めします。 このチュートリアルを完了すると、マルチプラットフォームの TodoList アプリである Xamarin Forms プロジェクトが作成されます。
ダウンロードしたクイック スタート サーバー プロジェクトを使用しない場合は、認証拡張機能パッケージをプロジェクトに追加する必要があります。 サーバー拡張機能パッケージの詳細については、「.NET バックエンド サーバー SDK for Azure Mobile Appsを使用する」を参照してください。
認証用にアプリを登録し、App Services を構成する
まず、ID プロバイダーのサイトでアプリを登録する必要があります。次に、Mobile Apps バックエンドでプロバイダーによって生成された資格情報を設定します。
プロバイダー固有の手順に従って、優先 ID プロバイダーを構成します。
アプリでサポートするプロバイダーごとに、前の手順を繰り返します。
許可された外部リダイレクト URL にアプリを追加する
セキュリティで保護された認証では、アプリの新しい URL スキームを定義する必要があります。 これにより、認証プロセスが完了すると、認証システムはアプリにリダイレクトし直すことができます。 このチュートリアルでは、appname のURLスキームを全体にわたって使用します。 ただし、選択した任意の URL スキームを使用できます。 モバイル アプリケーションに固有である必要があります。 サーバー側でリダイレクトを有効にするには:
Azure portalで、App Service を選択します。
認証/承認 メニュー オプションをクリックします。
許可された外部リダイレクト URLに、「
url_scheme_of_your_app://easyauth.callback
」と入力します。 この文字列の url_scheme_of_your_app は、モバイル アプリケーションの 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 バックエンド クイックスタート コード プロジェクトをダウンロードする」を参照してください。
ポータブル クラス ライブラリに認証を追加する
Mobile Apps では、MobileServiceClient の LoginAsync 拡張メソッドを使用して、App Service 認証を使用してユーザーをサインインします。 このサンプルでは、プロバイダーのサインイン インターフェイスをアプリに表示するサーバー管理認証フローを使用します。 詳細については、「 サーバー管理認証」を参照してください。 運用アプリでユーザー エクスペリエンスを向上させるためには、 代わりにクライアントで管理される認証を使用することを検討する必要があります。
Xamarin Forms プロジェクトで認証するには、アプリのポータブル クラス ライブラリで IAuthenticate インターフェイスを定義します。 次に、ポータブル クラス ライブラリで定義されているユーザー インターフェイスに サインイン ボタンを追加します。このボタンをクリックして認証を開始します。 認証が成功した後、モバイル アプリ バックエンドからデータが読み込まれます。
アプリでサポートされているプラットフォームごとに IAuthenticate インターフェイスを実装します。
Visual Studio または Xamarin Studio で、ポータブル クラス ライブラリ プロジェクトという 名前でプロジェクト からApp.csを開き、次の
using
ステートメントを追加します。```csharp using System.Threading.Tasks; ```
App.csで、
App
クラス定義の直前に、次のIAuthenticate
インターフェイス定義を追加します。```csharp public interface IAuthenticate { Task<bool> Authenticate(); } ```
プラットフォーム固有の実装でインターフェイスを初期化するには、次の静的メンバーを App クラスに追加します。
```csharp public static IAuthenticate Authenticator { get; private set; } public static void Init(IAuthenticate authenticator) { Authenticator = authenticator; } ```
ポータブル クラス ライブラリ プロジェクトから TodoList.xaml を開き、既存の ボタン の後にある buttonsPanel レイアウト要素に次の Button 要素を追加します。
```xml <Button x:Name="loginButton" Text="Sign-in" MinimumHeightRequest="30" Clicked="loginButton_Clicked"/> ```
このボタンにより、モバイル アプリ バックエンドでのサーバー管理認証がトリガーされます。
ポータブル クラス ライブラリ プロジェクトからTodoList.xaml.csを開き、次のフィールドを
TodoList
クラスに追加します。```csharp // Track whether the user has authenticated. bool authenticated = false; ```
OnAppearing メソッドを次のコードに置き換えます。
```csharp protected override async void OnAppearing() { base.OnAppearing(); // Refresh items only when authenticated. if (authenticated == true) { // Set syncItems to true in order to synchronize the data // on startup when running in offline mode. await RefreshItems(true, syncItems: false); // Hide the Sign-in button. this.loginButton.IsVisible = false; } } ```
このコードにより、認証後にのみデータがサービスから更新されます。
Clicked イベントの次のハンドラーを TodoList クラスに追加します。
```csharp async void loginButton_Clicked(object sender, EventArgs e) { if (App.Authenticator != null) authenticated = await App.Authenticator.Authenticate(); // Set syncItems to true to synchronize the data on startup when offline is enabled. if (authenticated == true) await RefreshItems(true, syncItems: false); } ```
変更を保存し、エラーがないことを確認してポータブル クラス ライブラリ プロジェクトをリビルドします。
Android アプリに認証を追加する
このセクションでは、Android アプリ プロジェクトで IAuthenticate インターフェイスを実装する方法について説明します。 Android デバイスをサポートしていない場合は、このセクションをスキップします。
Visual Studio または Xamarin Studio で、 ドロイド プロジェクトを右クリックし、[ スタートアップ プロジェクトとして設定] をクリックします。
F5 キーを押してデバッガーでプロジェクトを開始し、アプリの起動後に状態コード 401 (Unauthorized) の未処理の例外が発生することを確認します。 バックエンドへのアクセスは承認されたユーザーのみに制限されているため、401 コードが生成されます。
Android プロジェクトでMainActivity.csを開き、次の
using
ステートメントを追加します。```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; ```
次のように、 MainActivity クラスを更新して IAuthenticate インターフェイスを実装します。
```csharp public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity, IAuthenticate ```
次のように、IAuthenticate インターフェイスで必要な MobileServiceUser フィールドと Authenticate メソッドを追加して MainActivity クラスを更新します。
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { var success = false; var message = string.Empty; try { // Sign in with Facebook login using a server-managed flow. user = await TodoItemManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { message = string.Format("you are now signed-in as {0}.", user.UserId); success = true; } } catch (Exception ex) { message = ex.Message; } // Display the success or failure message. AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.SetMessage(message); builder.SetTitle("Sign-in result"); builder.Create().Show(); return success; } public override void OnResume() { base.OnResume(); Xamarin.Essentials.Platform.OnResume(); } ```
Facebook 以外の ID プロバイダーを使用している場合は、 MobileServiceAuthenticationProvider に別の値を選択します。
<application>
要素内に次の XML を追加して、AndroidManifest.xmlファイルを更新します。<activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true"> <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>
{url_scheme_of_your_app}
を URL スキームに置き換えます。LoadApplication()
の呼び出しの前に、MainActivity クラスの OnCreate メソッドに次のコードを追加します。```csharp // Initialize the authenticator before loading the app. App.Init((IAuthenticate)this); ```
このコードにより、アプリが読み込まれる前に認証子が初期化されます。
アプリをリビルドして実行し、選択した認証プロバイダーでサインインし、認証されたユーザーとしてデータにアクセスできることを確認します。
トラブルシューティング
でアプリケーションがクラッシュしました Java.Lang.NoSuchMethodError: No static method startActivity
場合によっては、サポート パッケージの競合が Visual Studio の警告として表示されますが、実行時にこの例外が発生してアプリケーションがクラッシュします。 この場合は、プロジェクトで参照されているすべてのサポート パッケージのバージョンが同じであることを確認する必要があります。
Azure Mobile Apps NuGet パッケージ には Android プラットフォーム Xamarin.Android.Support.CustomTabs
依存関係があるため、プロジェクトで新しいサポート パッケージを使用する場合は、競合を回避するために、必要なバージョンでこのパッケージを直接インストールする必要があります。
iOS アプリに認証を追加する
このセクションでは、iOS アプリ プロジェクトで IAuthenticate インターフェイスを実装する方法について説明します。 iOS デバイスをサポートしていない場合は、このセクションをスキップします。
Visual Studio または Xamarin Studio で、 iOS プロジェクトを右クリックし、[ スタートアップ プロジェクトとして設定] をクリックします。
F5 キーを押してデバッガーでプロジェクトを開始し、アプリの起動後に状態コード 401 (Unauthorized) の未処理の例外が発生することを確認します。 401 応答は、バックエンドへのアクセスが承認されたユーザーのみに制限されているために生成されます。
iOS プロジェクトでAppDelegate.csを開き、次の
using
ステートメントを追加します。```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; ```
次のように、IAuthenticate インターフェイスを実装するように AppDelegate クラスを更新します。
```csharp public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate, IAuthenticate ```
次のように、IAuthenticate インターフェイスで必要な MobileServiceUser フィールドと Authenticate メソッドを追加して、AppDelegate クラスを更新します。
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { var success = false; var message = string.Empty; try { // Sign in with Facebook login using a server-managed flow. if (user == null) { user = await TodoItemManager.DefaultManager.CurrentClient .LoginAsync(UIApplication.SharedApplication.KeyWindow.RootViewController, MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { message = string.Format("You are now signed-in as {0}.", user.UserId); success = true; } } } catch (Exception ex) { message = ex.Message; } // Display the success or failure message. UIAlertController avAlert = UIAlertController.Create("Sign-in result", message, UIAlertControllerStyle.Alert); avAlert.AddAction(UIAlertAction.Create("OK", UIAlertActionStyle.Default, null)); UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(avAlert, true, null); return success; } ```
Facebook 以外の ID プロバイダーを使用している場合は、[MobileServiceAuthenticationProvider] に別の値を選択します。
次のように、OpenUrl メソッドのオーバーロードを追加して AppDelegate クラスを更新します。
```csharp public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { if (TodoItemManager.DefaultManager.CurrentClient.ResumeWithURL(app, url, options)) return true; return base.OpenUrl(app, url, options); } ```
LoadApplication()
の呼び出しの前に、FinishedLaunching メソッドに次のコード行を追加します。```csharp App.Init(this); ```
このコードにより、アプリが読み込まれる前に認証子が初期化されます。
Info.plist を開き、 URL の種類を追加します。 識別子を選択した名前に設定し、URL スキームをアプリの URL スキームに設定し、ロールを None に設定します。
アプリをリビルドして実行し、選択した認証プロバイダーでサインインし、認証されたユーザーとしてデータにアクセスできることを確認します。
Windows 10 (Phone を含む) アプリ プロジェクトに認証を追加する
このセクションでは、Windows 10 アプリ プロジェクトで IAuthenticate インターフェイスを実装する方法について説明します。 ユニバーサル Windows プラットフォーム (UWP) プロジェクトにも同じ手順が適用されますが、 UWP プロジェクトを使用します (変更が記載されています)。 Windows デバイスをサポートしていない場合は、このセクションをスキップします。
Visual Studio で、 UWP プロジェクトを右クリックし、[ スタートアップ プロジェクトとして設定] をクリックします。
F5 キーを押してデバッガーでプロジェクトを開始し、アプリの起動後に状態コード 401 (Unauthorized) の未処理の例外が発生することを確認します。 401 応答は、バックエンドへのアクセスが承認されたユーザーのみに制限されているために発生します。
Windows アプリ プロジェクトのMainPage.xaml.csを開き、次の
using
ステートメントを追加します。```csharp using Microsoft.WindowsAzure.MobileServices; using System.Threading.Tasks; using Windows.UI.Popups; using <your_Portable_Class_Library_namespace>; ```
<your_Portable_Class_Library_namespace>
をポータブル クラス ライブラリの名前空間に置き換えます。次のように、 MainPage クラスを更新して IAuthenticate インターフェイスを実装します。
public sealed partial class MainPage : IAuthenticate
次のように、MobileServiceUser フィールドと、IAuthenticate インターフェイスで必要な Authenticate メソッドを追加して MainPage クラスを更新します。
```csharp // Define an authenticated user. private MobileServiceUser user; public async Task<bool> Authenticate() { string message = string.Empty; var success = false; try { // Sign in with Facebook login using a server-managed flow. if (user == null) { user = await TodoItemManager.DefaultManager.CurrentClient .LoginAsync(MobileServiceAuthenticationProvider.Facebook, "{url_scheme_of_your_app}"); if (user != null) { success = true; message = string.Format("You are now signed-in as {0}.", user.UserId); } } } catch (Exception ex) { message = string.Format("Authentication Failed: {0}", ex.Message); } // Display the success or failure message. await new MessageDialog(message, "Sign-in result").ShowAsync(); return success; } ```
Facebook 以外の ID プロバイダーを使用している場合は、 MobileServiceAuthenticationProvider に別の値を選択します。
LoadApplication()
の呼び出しの前に、MainPage クラスのコンストラクターに次のコード行を追加します。```csharp // Initialize the authenticator before loading the app. <your_Portable_Class_Library_namespace>.App.Init(this); ```
<your_Portable_Class_Library_namespace>
をポータブル クラス ライブラリの名前空間に置き換えます。UWP を使用している場合は、次の OnActivated メソッドのオーバーライドを App クラスに追加します。
```csharp protected override void OnActivated(IActivatedEventArgs args) { base.OnActivated(args); if (args.Kind == ActivationKind.Protocol) { ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs; MobileServiceClientExtensions.ResumeWithURL(TodoItemManager.DefaultManager.CurrentClient,protocolArgs.Uri); } } ```
Package.appxmanifest を開き、 プロトコル 宣言を追加します。 表示名を選択した名前に設定し、名前をアプリの URL スキームに設定します。
アプリをリビルドして実行し、選択した認証プロバイダーでサインインし、認証されたユーザーとしてデータにアクセスできることを確認します。
次のステップ
この基本認証チュートリアルを完了したので、次のいずれかのチュートリアルに進んでください。
プッシュ通知をアプリ に追加する
プッシュ通知のサポートをアプリに追加し、Azure Notification Hubs を使用してプッシュ通知を送信するようにモバイル アプリ バックエンドを構成する方法について説明します。
アプリ のオフライン同期を有効にする
モバイル アプリ バックエンドを使用してアプリのオフライン サポートを追加する方法について説明します。 オフライン同期を使用すると、エンド ユーザーは、ネットワーク接続がない場合でも、モバイル アプリ (データの表示、追加、変更) を操作できます。