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

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

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

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

カスタムスキームの登録

OpenID Connect 認証結果を受け取るためのカスタム 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="oidc_callback" />
    </intent-filter>
</activity>

OpenID Connect認証開始

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

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

{endpointUri}/1/{tenantId}/auth/oidc/start?op={op}&redirect={redirectUri}&scope={scope}&createUser={true|false}&sessionToken={sessionToken}
  • op、redirectUri は必須です。
  • op は連携する OpenID Connectプロバイダを指定します。設定可能な値は以下の通りです。
    • google: Google
    • adfs: ADFS (Windows Server 2016)
    • other: OpenAM
  • redirectUri にはリダイレクトURLを指定します。上述のカスタムURLスキーム宛を指定してください。
  • OIDC認証ユーザを作成する場合は、createUser=true を指定してください。
  • 作成済ユーザとのアカウントリンク設定をする場合は、sessionToken にリンクさせたいユーザのセッショントークンを指定してください。
  • scope はオプションです。取得したい属性情報(OpenID Connectスコープ)を指定します。必ず "openid" が含まれている必要があります。

redirectUri, scope については、いずれもURIエンコードが必要な点に注意してください。

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

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

final String endpointUri = "{エンドポイントURI}"
final String tenantId = "{テナントID}"
final String op = "{OP種別}"
final String scope = "{Scope値}"

// 起動用 URI 生成
StringBuffer sbRequestUri = new StringBuffer();
sbRequestUri.append(String.format("%s/1/%s/auth/oidc/start", endpointUri, tenantId));
sbRequestUri.append(String.format("?redirect=%s", URLEncoder.encode(redirectUri, "UTF-8")));
sbRequestUri.append(String.format("&op=%s",op));
sbRequestUri.append("&createUser=true");
if(scope.compareTo("") != 0) {
    sbRequestUri.append(String.format("&scope=%s", URLEncoder.encode(scope, "UTF-8")));
}
Uri uri = Uri.parse(sbRequestUri.toString());

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

OpenID Connect認証完了時の処理

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

sampleapp1://oidc_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() {
    /* 中略 */
});