iOS アプリに認証を追加する

このチュートリアルでは、サポートされている ID プロバイダーを使用して、 iOS クイック スタート プロジェクトに認証を追加します。 最初に、このチュートリアルの基になっている iOS クイック スタート チュートリアルを完了しておく必要があります。

アプリケーションを認証に登録し、App Service を構成する

最初に、ID プロバイダーのサイトでアプリを登録する必要があります。その後、プロバイダーによって生成された資格情報を Mobile Apps バックエンドに設定します。

  1. 次のプロバイダー固有の指示に従い、任意の ID プロバイダーを構成します。

  2. アプリ内でサポートするプロバイダーごとに、前の手順を繰り返します。

許可されている外部リダイレクト URL にアプリを追加する

認証をセキュリティで保護するには、アプリ用の新しい URL スキームの定義が必要になります。 これによって、認証プロセスが完了すると認証システムからアプリにリダイレクトできます。 このチュートリアル全体を通して、URL スキーム appname を使用します。 ただし、選択したあらゆる URL スキームを使用できます。 URL スキームは、モバイル アプリに対して一意である必要があります。 サーバー側でリダイレクトを有効にするには、以下の手順に従います。

  1. Azure Portal で、App Service を選択します。

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

  3. [認証プロバイダー] セクションの下の [Azure Active Directory] をクリックします。

  4. [Management mode (管理モード)][Advanced (詳細)] に設定します。

  5. [Allowed External Redirect URLs (許可されている外部リダイレクト URL)]appname://easyauth.callback を入力します。 この文字列の appname は、モバイル アプリケーションの URL スキームです。 プロトコルの通常の URL 仕様 (文字と数字のみを使用し、文字で始まる) に従う必要があります。 数か所で URL スキームに合わせてモバイル アプリケーション コードを調整する必要があるため、選択した文字列をメモしておく必要があります。

  6. [OK] をクリックします。

  7. [保存] をクリックします。

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

既定では、Mobile Apps バックエンドの API は匿名で呼び出すことができます。 次に、認証されたクライアントのみにアクセスを制限する必要があります。

  • Node.js バックエンド (Azure Portal 経由):

    Mobile Apps の設定で、[ 簡単なテーブル ] をクリックし、テーブルを選択します。 [アクセス許可の変更] をクリックし、すべてのアクセス許可に対して [Authenticated access only (認証済みアクセスのみ)] を選択し、[保存] をクリックします。

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

    サーバー プロジェクトで、 Controllers>TodoItemController.cs に移動します。 次のように、 [Authorize] 属性を TodoItemController クラスに追加します。 アクセスを特定のメソッドのみに制限するには、この属性を、クラスではなく、そのメソッドのみに適用するだけです。 サーバー プロジェクトを発行します。

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

    テーブルへのアクセスに対して認証を要求するには、Node.js サーバー スクリプトに次の行を追加します。

      table.access = 'authenticated';
    

    詳細については、「方法: テーブルへのアクセスに認証を要求する」を参照してください。 自社サイトからクイック スタート コード プロジェクトをダウンロードする方法については、「 方法: Git を使用して Node.js バックエンド クイック スタート コード プロジェクトをダウンロードする」を参照してください。

Xcode で、 [Run] をクリックしてアプリケーションを開始します。 認証されないユーザーとしてアプリがバックエンドにアクセスしようとしても、TodoItem テーブルで認証が要求されるために例外が発生します。

アプリケーションに認証を追加する

Objective-C:

  1. Mac の Xcode で QSTodoListViewController.m を開き、次のメソッドを追加します。

    - (void)loginAndGetData
    {
        QSAppDelegate *appDelegate = (QSAppDelegate *)[UIApplication sharedApplication].delegate;
        appDelegate.qsTodoService = self.todoService;
    
        [self.todoService.client loginWithProvider:@"google" urlScheme:@"appname" controller:self animated:YES completion:^(MSUser * _Nullable user, NSError * _Nullable error) {
            if (error) {
                NSLog(@"Login failed with error: %@, %@", error, [error userInfo]);
            }
            else {
                self.todoService.client.currentUser = user;
                NSLog(@"User logged in: %@", user.userId);
    
                [self refresh];
            }
        }];
    }
    

    Google を ID プロバイダーとして使用しない場合は、googlemicrosoftaccounttwitterfacebookwindowsazureactivedirectory のいずれかに変更します。 Facebook を使用する場合は、アプリで Facebook ドメインを許可リスト に登録する必要があります。

    urlScheme をアプリケーションの一意の名前に置き換えます。 urlScheme は、Azure Portal [Allowed External Redirect URLs (許可されている外部リダイレクト URL)] フィールドに指定した URL スキーム プロトコルと同じにする必要があります。 urlScheme は、認証要求が完了した後にアプリケーションに戻るために、認証コールバックで使用されます。

  2. QSTodoListViewController.m 内の viewDidLoad[self refresh] を次のコードに置き換えます。

    [self loginAndGetData];
    
  3. QSAppDelegate.h ファイルを開き、次のコードを追加します。

    #import "QSTodoService.h"
    
    @property (strong, nonatomic) QSTodoService *qsTodoService;
    
  4. QSAppDelegate.m ファイルを開き、次のコードを追加します。

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
    {
        if ([[url.scheme lowercaseString] isEqualToString:@"appname"]) {
            // Resume login flow
            return [self.qsTodoService.client resumeWithURL:url];
        }
        else {
            return NO;
        }
    }
    

    #pragma mark - Core Data stack という行の前にこのコードを直接追加します。 appname を、手順 1. で使用した urlScheme 値で置き換えます。

  5. AppName-Info.plist ファイル (AppName はアプリの名前で置き換える) を開き、次のコードを追加します。

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    このコードは、<dict> 要素内に配置する必要があります。 appname 文字列 (CFBundleURLSchemes の配列内) を、手順 1 で選択したアプリ名で置き換えます。 plist エディターでこれらに変更を加えることもできます。XCode で AppName-Info.plist ファイルをクリックして plist エディターを開きます。

    CFBundleURLNamecom.microsoft.azure.zumo 文字列を Apple のバンドル識別子で置き換えます。

  6. [実行] をクリックしてアプリを起動したら、ログインします。 ログインが成功すると、Todo リストを表示して更新できます。

Swift:

  1. Mac の Xcode で ToDoTableViewController.swift を開き、次のメソッドを追加します。

    func loginAndGetData() {
    
        guard let client = self.table?.client, client.currentUser == nil else {
            return
        }
    
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.todoTableViewController = self
    
        let loginBlock: MSClientLoginBlock = {(user, error) -> Void in
            if (error != nil) {
                print("Error: \(error?.localizedDescription)")
            }
            else {
                client.currentUser = user
                print("User logged in: \(user?.userId)")
            }
        }
    
        client.login(withProvider:"google", urlScheme: "appname", controller: self, animated: true, completion: loginBlock)
    
    }
    

    Google を ID プロバイダーとして使用しない場合は、googlemicrosoftaccounttwitterfacebookwindowsazureactivedirectory のいずれかに変更します。 Facebook を使用する場合、アプリで Facebook ドメインをホワイトリストに追加する必要があります。

    urlScheme をアプリケーションの一意の名前に置き換えます。 urlScheme は、Azure Portal [Allowed External Redirect URLs (許可されている外部リダイレクト URL)] フィールドに指定した URL スキーム プロトコルと同じにする必要があります。 urlScheme は、認証要求が完了した後にアプリケーションに戻るために、認証コールバックで使用されます。

  2. ToDoTableViewController.swiftviewDidLoad() の最後にある self.refreshControl?.beginRefreshing()self.onRefresh(self.refreshControl) の行を削除します。 その場所に loginAndGetData() の呼び出しを追加します。

    loginAndGetData()
    
  3. AppDelegate.swift ファイルを開き、次のコード行を AppDelegate クラスに追加します。

    var todoTableViewController: ToDoTableViewController?
    
    func application(_ application: UIApplication, openURL url: NSURL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        if url.scheme?.lowercased() == "appname" {
            return (todoTableViewController!.table?.client.resume(with: url as URL))!
        }
        else {
            return false
        }
    }
    

    appname を、手順 1. で使用した urlScheme 値で置き換えます。

  4. AppName-Info.plist ファイル (AppName はアプリの名前で置き換える) を開き、次のコードを追加します。

    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleURLName</key>
            <string>com.microsoft.azure.zumo</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>appname</string>
            </array>
        </dict>
    </array>
    

    このコードは、<dict> 要素内に配置する必要があります。 appname 文字列 (CFBundleURLSchemes の配列内) を、手順 1 で選択したアプリ名で置き換えます。 plist エディターでこれらに変更を加えることもできます。XCode で AppName-Info.plist ファイルをクリックして plist エディターを開きます。

    CFBundleURLNamecom.microsoft.azure.zumo 文字列を Apple のバンドル識別子で置き換えます。

  5. [実行] をクリックしてアプリを起動したら、ログインします。 ログインが成功すると、Todo リストを表示して更新できます。

App Service の認証では、Apple の Inter-App Communication が使用されます。 このトピックの詳細については、Apple のドキュメントを参照してください。