5.8.3. Native アプリケーション (Android)

Android による SAML 認証の実装方法を記載します。

大きく分けて、以下の4つの処理を実装します。

  • カスタムスキームの登録
  • SAML 認証開始 REST API の実行
  • SAML 認証完了時の処理
  • BaaS サーバへのログイン

カスタムスキームの登録

SAML 認証結果を受け取るためのカスタム URL スキームを登録します。

ここでは例として "sampleapp1://" スキームを使用することにします。 (実際にはアプリ固有の名称に変更してください)

AndroidManifest.xml に以下のように intent-filter を設定します。 ここではカスタム URL スキームが起動されたときに Activity が起動されるように設定しています。

<activity android:name="{Activityクラス名}"
    ...
    <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="sampleapp1" android:host="saml_callback" />
    </intent-filter>
</activity>

SAML認証開始

ブラウザを起動して SAML 認証開始の REST API を実行します。

REST API の URI は、以下のとおりです。

{endpointUri}/1/{tenantId}/auth/saml/init?redirect={redirectUri}

以下にサンプルコードを示します。

// リダイレクト URI
final String redirectUri = "sampleapp1://saml_callback"

final String endpointUri = "{エンドポイントURI}"
final String tenantId = "{テナントID}"

// 起動用 URI 生成
Uri uri = Uri.parse(String.format("%s/1/%s/auth/saml/init?redirect=%s",
    endpointUri, tenantId, URLEncoder.encode(redirectUri, "UTF-8")));

// ブラウザ起動
Intent intent = new intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

SAML認証完了時の処理

SAML 認証完了が完了すると、カスタムスキームURIにリダイレクトされます。 リダイレクトURIは以下のようにワンタイムトークンがクエリパラメータに格納された形になります。

sampleapp1://saml_callback?token=123456789abcdef

カスタムスキームURIが起動されると、上記で設定した intent-filter の指定により Activity の onNewIntent() が呼び出されます。 Intent の Data にリダイレクト URI が格納されており、この中に認証用の「ワンタイムトークン」 が含まれています。これを NbUser.extractOneTimeTokenFromUri() で取り出します。

以下にサンプルコードを示します。

@Override
protected void onNewIntent(Intent intent){
    super.onNewIntent(intent);

    // リダイレクト URI を取り出す
    Uri uri = intent.getData();

    // ワンタイムトークンを取り出す
    LoginParam param = NbUser.extractOneTimeTokenFromUri(uri.toString());

    ...

BaaS サーバへのログイン

ワンタイムトークンを指定してログインします。

上記で取得した LoginParam を指定して NbUser.login() を呼び出してください。

サーバからセッショントークンが払いだされ、以降は本セッショントークンで認証が行われます。 以下にサンプルコードを示します。

// ログイン
NbUser.login(loginParam, new NbUserCallback() {
    /* 中略 */
});