ウェアラブルでの認証

Wear OS アプリは、コンパニオン アプリがなくても単独で実行できます。つまり Wear OS アプリでアクセス時の認証を独自に管理する必要がある インターネットからのデータです。スマートウォッチは画面サイズが小さく、 入力機能によって、Wear OS アプリで使用できる認証オプションが制限されます。

このガイドでは、Wear OS アプリで推奨される認証方法と、それらの方法がアプリのユースケースに適合しない場合の代替方法について説明します。

優れたログイン エクスペリエンスを設計する方法について詳しくは、ログイン UX ガイドをご覧ください。

ゲストモード

すべての機能で認証を求めるのではなく、できるだけ多くの機能を提供する ユーザーにログインを求めることなくその機能を使用できます。

ユーザーがモバイルを使用せずに Wear アプリを見つけてインストールする可能性がある そのため、アカウントを持っておらず、どの機能を 提供しますゲストモード機能でアプリの機能を正確に紹介できるか確認してください。

デバイスによっては、ロック解除状態が長く続くことがあります

Wear OS 5 以降を搭載する対応デバイスでは、 ユーザーがデバイスを手首に装着しているときユーザーが手首検出をオフにしてデバイスを手首から外すと、通常よりも長い時間デバイスのロックが解除されたままになります。

アプリの表示中に高いレベルのセキュリティが - まず、手首の装着検知が有効になっているかどうかを enabled:

val wristDetectionEnabled =
        isWristDetectionAutoLockingEnabled(applicationContext)

このメソッドの戻り値が false の場合、ユーザー固有のコンテンツを表示する前に、アプリのアカウントにログインするようユーザーに求めるメッセージを表示します。

推奨される認証方法

スタンドアロンの Wear OS アプリを有効にするには、次の認証方法を使用します。 取得します。

データレイヤを使用してトークンを渡す

スマートフォンのコンパニオン アプリは、ウェアラブル データレイヤを使用して認証データを Wear OS アプリに安全に転送できます。認証情報をメッセージまたはデータアイテムとして転送します。

この種の認証では通常、ユーザーによる操作は必要ありません。ただし、ログイン中であることをユーザーに通知せずに認証を行うことは避けてください。閉じることができる簡単な画面を使用して、アカウントがモバイルから移行されることをユーザーに通知できます。

重要: このオプションは、対応するモバイルアプリがインストールされている場合に、Android とペア設定されたスマートウォッチでしか機能しないため、Wear アプリは他の認証方法を少なくとも 1 つ提供する必要があります。対応するモバイルアプリを持っていないユーザーや、Wear OS デバイスが iOS デバイスとペア設定されているユーザー向けに、代替の認証方法を提供してください。

次の例に示すように、モバイルアプリからデータレイヤを使用してトークンを渡します。

val token = "..." // Auth token to transmit to the wearable device.
val dataClient: DataClient = Wearable.getDataClient(context)
val putDataReq: PutDataRequest = PutDataMapRequest.create("/auth").run {
    dataMap.putString("token", token)
    asPutDataRequest()
}
val putDataTask: Task<DataItem> = dataClient.putDataItem(putDataReq)

次の例に示すように、スマートウォッチ アプリのデータ変更イベントをリッスンします。

val dataClient: DataClient = Wearable.getDataClient(context)
dataClient.addListener{ dataEvents ->
    dataEvents.forEach { event ->
        if (event.type == DataEvent.TYPE_CHANGED) {
            val dataItemPath = event.dataItem.uri.path ?: ""
            if (dataItemPath.startsWith("/auth")) {
                val token = DataMapItem.fromDataItem(event.dataItem).dataMap.getString("token")
                // Display interstitial screen to notify the user they are being signed in.
                // Then, store the token and use it in network requests.
            }
        }
    }
}

ウェアラブル データレイヤの使用方法について詳しくは、Wear OS でのデータの送信と同期をご覧ください。

OAuth 2.0 を使用する

Wear OS は 2 つの OAuth 2.0 ベースのフローをサポートしています。これらについては、この後のセクションで説明します。

  • RFC 7636 で定義されている、Proof Key for Code Exchange(PKCE)による Authorization Code Grant
  • RFC 8628 で定義されている Device Authorization Grant

注: スマートウォッチが常に画面表示モードになったときにアプリがシャットダウンしないようにするには、認証を行うアクティビティで AmbientModeSupport.attach を使用して常時オンを有効にします。常に画面表示モードに関するおすすめの方法については、Wear でアプリを表示したままにするをご覧ください。

Proof Key for Code Exchange(PKCE)

PKCE を効果的に使用するには、RemoteAuthClient を使用します。

Wear OS アプリから OAuth プロバイダに認証リクエストを行うには、OAuthRequest オブジェクトを作成します。このオブジェクトは、トークンを取得するための OAuth エンドポイントへの URL と CodeChallenge オブジェクトで構成されます。次のコードは、認証リクエストの作成例を示しています。

val request = OAuthRequest.Builder(this.applicationContext)
    .setAuthProviderUrl(Uri.parse("https://...."))
    .setClientId(clientId)
    .setCodeChallenge(codeChallenge)
    .build()

認証リクエストを作成したら、sendAuthorizationRequest() メソッドを使用してコンパニオン アプリに送信します。

val client = RemoteAuthClient.create(this)
client.sendAuthorizationRequest(request,
    { command -> command?.run() },
    object : RemoteAuthClient.Callback() {
        override fun onAuthorizationResponse(
            request: OAuthRequest,
            response: OAuthResponse
        ) {
            // Extract the token from the response, store it and use it in network requests.
        }

        override fun onAuthorizationError(errorCode: Int) {
            // Handle error
        }
    }
)

このリクエストによってコンパニオン アプリの呼び出しがトリガーされ、ユーザーのスマートフォンのウェブブラウザに認証 UI が表示されます。OAuth 2.0 プロバイダがユーザーを認証し、リクエストされた権限についてユーザーの同意を得ます。レスポンスは、自動生成されたリダイレクト URL に送信されます。

認証が成功または失敗した後、OAuth 2.0 サーバーは、リクエストで指定された URL にリダイレクトします。ユーザーがアクセス リクエストを承認すると、レスポンスに認証コードが格納されます。ユーザーがリクエストを承認しないと、レスポンスにエラー メッセージが格納されます。

レスポンスはクエリ文字列の形式を取り、次の例のようになります。

  https://wear.googleapis.com/3p_auth/com.your.package.name?code=xyz
  https://wear.googleapis-cn.com/3p_auth/com.your.package.name?code=xyz

これにより、ユーザーをコンパニオン アプリに誘導するページが読み込まれます。コンパニオン アプリはレスポンス URL を検証し、onAuthorizationResponse API を使用してサードパーティのスマートウォッチ アプリにレスポンスを中継します。

スマートウォッチ アプリは、認証コードをアクセス トークンと交換できます。

注: OAuthRequest が作成されたら、redirectUrl にアクセスしてリダイレクト URL を確認できます。

Device Authorization Grant

Device Authorization Grant を使用する場合、ユーザーは別のデバイスで検証 URI を開きます。次に、認証サーバーはリクエストを承認または拒否するよう求めます。

このプロセスを簡素化するには、次の例に示すように、RemoteActivityHelper を使用して、ユーザーのペア設定されたモバイル デバイスでウェブページを開きます。

// Request access from the authorization server and receive Device Authorization Response.
val verificationUri = "..." // Extracted from the Device Authorization Response.
RemoteActivityHelper.startRemoteActivity(
    this,
    Intent(Intent.ACTION_VIEW)
        .addCategory(Intent.CATEGORY_BROWSABLE)
        .setData(Uri.parse(verificationUri)),
    null
)
// Poll the authorization server to find out if the user completed the user authorization
// step on their mobile device.

iOS アプリの場合は、トークンの認証にブラウザを使用するのではなく、ユニバーサル リンクを使用して、アプリでこのインテントをインターセプトします。

その他の認証方法

Wear OS は、この後のセクションで説明するその他のログイン方法をサポートしています。

Google ログイン

Google ログインでは、ユーザーは既存の Google アカウントを使用してログインできます。特に、Google ログインをハンドヘルド アプリにすでに実装している場合は、最適なユーザー エクスペリエンスが提供され、サポートが容易になります。

Google ログインは、iOS でも適切に動作するので、前述の推奨される認証方法の次に推奨されるソリューションです。次の セクションでは、基本的な Google ログインの統合を完了する方法について説明します。

前提条件

Google ログインを Wear OS アプリに統合する前に、 Google API Console プロジェクトを開き、Android Studio プロジェクトをセットアップします。詳しくは、Android アプリへの Google ログインの統合を開始するをご覧ください。

バックエンド サーバーと通信するアプリまたはサイトで Google ログインを使用する場合は、次の 2 つの前提条件があります。

  • クライアント用の OAuth 2.0 ウェブ アプリケーション クライアント ID を バックエンドサーバーと通信しますこのクライアント ID は、アプリのクライアント ID とは異なります。詳しくは、サーバーサイド アクセスの有効化をご覧ください。
  • サーバーで現在ログイン中のユーザーを安全に特定するには、HTTPS を使用してユーザーの ID トークンを送信します。バックエンド サーバーでユーザーを認証する方法については、バックエンド サーバーで認証するをご覧ください。

Google ログインをアプリに統合する

Google ログインを Wear OS アプリに統合するには、この後のセクションで説明している手順を確認して実施します。

  1. Google ログインを設定します
  2. Google ログインボタンを追加します
  3. ログインボタンがタップされたら、ログインフローを開始します

Google ログインを構成し、GoogleApiClient オブジェクトを作成する

ログイン アクティビティの onCreate() メソッドで、アプリに必要なユーザーデータをリクエストするように Google ログインを構成します。次に、Google Sign-In API と指定したオプションへのアクセス権を持つ GoogleApiClient オブジェクトを作成します。次の例はそれらの手順を示しています。

public class MyNewActivity extends AppCompatActivity {

    private static final int RC_SIGN_IN = 9001;

    private GoogleSignInClient mSignInClient;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        GoogleSignInOptions options =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .build();

        mSignInClient = GoogleSignIn.getClient(this, options);
    }
}

Google ログインボタンをアプリに追加する

Google ログインボタンを追加する手順は次のとおりです。

  1. SignInButton をアプリのレイアウトに追加します。
  2.  <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  3. アプリの onCreate() メソッドでボタンの OnClickListener を登録し、タップされたときにユーザーがログインできるようにします。
  4. Kotlin

    findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
    

    Java

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

ログイン インテントを作成し、ログインフローを開始する

getSignInIntent() メソッドでログイン インテントを作成することにより、onCLick() メソッドでログインボタンのタップを処理します。次に、startActivityForResult() メソッドでインテントを開始します。

Intent intent = mSignInClient.getSignInIntent();
startActivityForResult(intent, RC_SIGN_IN);

ユーザーは、ログインに使用する Google アカウントを選択するよう求められます。スコープをリクエストした場合 プロファイル、メール、オープン ID 以外のリソースの場合、ユーザーはこれらの 説明します。

最後に、アクティビティの onActivityResult メソッドで、getSignInResultFromIntent を使用してログイン結果を取得します。ログイン結果を取得したら、 ログインに成功したかどうかを確認するために、 <ph type="x-smartling-placeholder"></ph> isSuccess メソッドを使用します。ログインが成功した場合は、getSignInAccount メソッドを呼び出して、ログイン中のユーザーに関する情報(ユーザー名など)を含む GoogleSignInAccount オブジェクトを取得できます。次の例はそれらの手順を示しています。

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
    super.onActivityResult(requestCode, resultCode, data)

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        Auth.GoogleSignInApi.getSignInResultFromIntent(data)?.apply {
            if (isSuccess) {
                // Get account information.
                fullName = signInAccount?.displayName
                mGivenName = signInAccount?.givenName
                mFamilyName = signInAccount?.familyName
                mEmail = signInAccount?.email
            }
        }
    }
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...).
    if (requestCode == RC_SIGN_IN) {
        GoogleSignInResult signInResult = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
        if (signInResult.isSuccess()) {
            GoogleSignInAccount acct = signInResult.getSignInAccount();

            // Get account information.
            fullName = acct.getDisplayName();
            givenName = acct.getGivenName();
            familyName = acct.getFamilyName();
            email = acct.getEmail();
        }
    }
}

Google ログインを実装するサンプルアプリを確認するには、 <ph type="x-smartling-placeholder"></ph> GitHub の Horologist Google ログイン サンプル

カスタムコード認証

前述の認証方法の代わりに、スマートフォンやタブレットなどの別のデバイスから認証を行い、一時的な数値コードを取得することをユーザーに要求する方法もあります。その後、ユーザーは Wear OS デバイスにコードを入力して本人確認を行い、認証トークンを受け取ります。

この認証フローでは、アプリのログイン モジュールを使用するか、サードパーティ認証プロバイダによるログイン方法をアプリのコードに手動で組み込みます。この認証方法では手動での作業やセキュリティ向上のための追加作業が必要になりますが、スタンドアロンの Wear OS アプリで早い段階で認証を行う必要がある場合はこの方法を使用できます。

この設定の認証フローは次のように機能します。

  1. ユーザーが、認証を必要とする Wear OS アプリで操作を行います。
  2. Wear OS アプリがユーザーに認証画面を表示し、 ユーザーが指定の URL からコードを入力すること。
  3. ユーザーがモバイル デバイス、タブレット、パソコンのいずれかでブラウザを起動し、Wear OS アプリで指定された URL に移動してログインします。
  4. ユーザーが一時的な数値コードを受け取り、Wear OS のオンボード キーボードを使用して Wear OS アプリの認証画面にそのコードを入力します。

  5. この時点から、入力したコードが正しいことを証明できます。 Wear OS デバイスに保存されて保護されている認証トークンとコードを交換します。 認証されます。

注: ユーザーが生成するコードには、英字を含めず数字のみが含まれるようにする必要があります。

次の図はこの認証フローを示しています。