ちょっと話題の記事

認証基盤サービス「Auth0」を使ってみる

2015.06.30

Auth0 とは

Auth0 - Identity infrastructure, built for developers

Auth0 は認証基盤サービス (IdMaaS) です。モバイルアプリや Web アプリに認証基盤を提供し、専用の SDK を利用して新規登録やログインなどといった API を呼び出すことが出来ます。

auth0-01

コンセプトは「シンプルなアイデンティティをプロダクトに提供する」ところにあり、認証に関する様々な便利な機能を提供してくれます。

  • 拡張性
  • シンプルなAPI
  • ユーザー中心的
  • 標準のプロトコル準拠
  • SDKの提供
  • 解析(アナリティクス)
  • クラウド・ハイブリッド
  • マルチプラットフォーム
  • スケーラビリティと信頼性

Auth0 の最大の特長は様々な既存プロバイダと自由に連係可能な点だと思います。ソーシャルプロバイダーのSSOをはじめ、ADやLDAP、SAMLを通したオンプレの認証基盤連係、データベースへの直接アクセスなどといったように、様々な形式で既存プロバイダと連係可能です。既に運用している認証基盤があったとしても、ほとんどのケースにおいて連係して移行できます。

ということで、私の中でずっと気になっていた Auth0 を初めて触ってみました。

料金体系

Auth0 は $15/月 から利用可能です。ただし、開発アカウントだけであれば全ての機能を無料で利用可能です。

Pricing - Auth0

プラン 月額 ユーザー数 ソーシャルSSO ルール作成 ユーザーDB SLA保証 その他
Social Starter $15 1,000人 -
Social+ Starter $49 1,000人 -
Social+ Premium $107 1,000人 DBサポート
Enterprise Starter $70 200人 -
Enterprise Premium $150 200人 プレミアムサポート

上記プランの他、カスタムプランによる利用も可能です。

アカウントの新規登録とアプリの作成

それでは、アカウントの新規登録から初めてみましょう。トップページの「CREATE FREE ACCOUNT」をクリックするとログイン画面が表示されます。メール認証のほか、GitHub、Google、Microsoft などの SSO が利用できます。メール認証の場合は、登録後に承認メールが送信されているので、承認しておきましょう。

auth0-02

次に、リージョンとドメインを設定します。リージョンは US-EastEurope Central のいずれかを選択します。ドメイン名は適当に。末尾に .auth0.com が付きます(Europe Centraleu.auth0.com)。

auth0-03

次に、認証プロバイダを設定します。Facebook、Google、Linkedin、Twitter、Windows Live が有効化できます。また、認証プロバイダを使用しない、ユーザー名&パスワードによる認証を付けることも出来ます。

auth0-04

上記設定が完了すると、ダッシュボードが表示されます。

auth0-05

iOS アプリで使ってみる

今回は iOS アプリで使ってみたいと思います。ダッシュボードより「Native Mobile App」の「SELECT」をクリックします。

いろいろな SDK の中から選択できます!今回は iOS で使いたいので「IOS - OBJECTIVE C」を選択しました。

auth0-07

API も利用するか問われますが、今回は使わないので「NO, SKIP THIS」をクリックします。

auth0-08

iOS アプリに組み込むためのチュートリアルが表示されました。組み込み済みのプロジェクトをダウンロードすることができますが、今回は手順通り進めてみたいと思います。

auth0-09

1. Callback URL の設定

まず、Auth0 の Web コンソール画面にて、Callback URL を設定する必要があります。先ほど表示したチュートリアル画面の中の「Before Starting」の中に設定値が書いてあるので、コピーします。

auth0-10

「Before Starting」の説明の中に「Application Settings」のリンクがあるのでそこからアプリ設定を開き、「Allowed Callback URLs」欄にペーストして「SAVE CHANGES」をクリックします。

auth0-11

これで、Callback URL の設定が完了しました。

2. SDK のインポート

次に SDK を CocoaPods を使ってインポートします。Xcode プロジェクトは作成済みの前提ですがご了承ください。Podfile に以下のライブラリを追加し、コマンドラインから pod install を実行します。JWTDecode は Swift で書かれているので use_frameworks! が必要です。

use_frameworks!

pod 'Lock', '~> 1.12'
pod 'JWTDecode', '~> 0.2'

3. プロジェクトの設定の変更

次に、プロジェクトの設定を変更します。まずチュートリアルの中の「2. Configure Auth0 Lock for iOS」セクションの「Auth0ClientId」と「Auth0Domain」のキーと値、そしてその下に赤字で書かれている URL スキームをコピーします。

auth0-12

Xcode プロジェクトを開き、Info.plist に先ほどのキーと値を追加します。

auth0-13

次に「Info」を開き、「URL Types」で URL スキームを追加します。「Identifier」は Auth0、「URL Schemes」は先ほどコピーし、赤字で書かれていた URL スキーム の値です。

auth0-14

以上で、プロジェクトの設定は完了です。

4. 実装

次に実装です。まず MyApplication というクラスを作成します。このクラスは Auth0 の API をどこからでも叩けるようにするためのクラスです。クラス名は何でも構いませんが、とりあえずチュートリアル通り MyApplication としています。

#import <Foundation/Foundation.h>

@class A0Lock;
@interface MyApplication : NSObject

@property (readonly, nonatomic) A0Lock *lock;
+ (MyApplication *)sharedInstance;

@end
#import "MyApplication.h"
#import <Lock/Lock.h>

@implementation MyApplication

+ (MyApplication*)sharedInstance {
    static MyApplication *sharedApplication = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedApplication = [[self alloc] init];
    });
    return sharedApplication;
}

- (id)init {
    self = [super init];
    if (self) {
        _lock = [A0Lock newLock];
    }
    return self;
}

@end

次に AppDelegate を変更します。application:didFinishLaunchingWithOptions:application:openURL:sourceApplication:annotation: を Auth0 の SDK がハンドリングできるようにするための処理を追加します。

#import "AppDelegate.h"
#import "MyApplication.h"
#import <Lock/Lock.h>

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    A0Lock *lock = [[MyApplication sharedInstance] lock];
    [lock applicationLaunchedWithOptions:launchOptions];
    return YES;
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    A0Lock *lock = [[MyApplication sharedInstance] lock];
    return [lock handleURL:url sourceApplication:sourceApplication];
}

@end

最後に、適当な View Controller でログイン画面を呼び出します。

#import "ViewController.h"
#import "MyApplication.h"
#import <Lock/Lock.h>

@implementation ViewController

- (IBAction)loginButtonDidTouch:(id)sender {
    A0Lock *lock = [[MyApplication sharedInstance] lock];
    A0LockViewController *controller = [lock newLockViewController];
    controller.onAuthenticationBlock = ^(A0UserProfile *profile, A0Token *token) {
        [self dismissViewControllerAnimated:YES completion:nil];
        NSString *message = [NSString stringWithFormat:@"ID : %@", profile.userId];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"ログイン成功!"
                                                        message: message
                                                       delegate:nil
                                              cancelButtonTitle:nil
                                              otherButtonTitles:@"OK", nil];
    };
    [self presentViewController:controller animated:YES completion:nil];
}

@end

以上で実装は終わりです!

5. 実行してみる

アプリを実行してみましょう。ログイン画面が表示されます。今回は Twitter でログインしてみます。

auth0-15

Twitterで承認すると…

auth0-16

ログインできました!

auth0-17

まとめ

とっても簡単に認証基盤が出来上がりました。最短距離で試しているだけですので、Auth0 はもっともっといろいろな事が出来ます。引き続き調べていきたいと思います。

ということで、個人ブログ300本目の投稿でした。これからもいろいろな技術やサービスなどなどに触れ、楽しめて役に立つ記事を目標に執筆していきますので、どうぞよろしくお願い致します。