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 は ログインは iOS でも適切に動作するため、次におすすめするソリューションである。次の セクションでは、基本的な Google ログインの統合を完了する方法について説明します。
前提条件
Google ログインを Wear OS アプリに統合する前に、 Google API Console プロジェクトを作成し、Android Studio プロジェクトをセットアップします。詳しくは <ph type="x-smartling-placeholder"></ph>をご覧ください Android アプリへの Google ログインの統合を開始するをご覧ください。
Google ログインを バックエンド サーバーと通信するには、さらに 2 つの前提条件があります。
- クライアント用の OAuth 2.0 ウェブ アプリケーション クライアント ID を バックエンドサーバーと通信しますこのクライアント ID は、アプリのクライアント ID とは異なります。詳細 詳しくは、 <ph type="x-smartling-placeholder"></ph> サーバーサイド アクセスの有効化をご覧ください。
- ユーザーの ID トークンを送信して、現在ログインしているユーザーをサーバー上で安全に特定する 通信できます。バックエンド サーバーでユーザーを認証する方法については、以下をご覧ください。 <ph type="x-smartling-placeholder"></ph> バックエンド サーバーで認証する。
Google ログインをアプリに統合する
以降のセクションで詳述されている手順を確認して実装します。 以下の手順に沿って、Google ログインを Wear OS アプリに統合します。
Google ログインを構成し、GoogleApiClient オブジェクトを作成する
ログイン アクティビティの onCreate()
メソッドで、Google ログインが
アプリが必要とするユーザーデータが収集されます。次に、このファイルで GoogleApiClient
オブジェクトを作成します。
Google Sign-In API と指定したオプションにアクセスできる必要があります。以下の手順
次に例を示します。
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 ログインボタンを追加する手順は次のとおりです。
-
<ph type="x-smartling-placeholder"></ph>を追加します
SignInButton
をアプリのレイアウトに追加します。 -
アプリの
onCreate()
メソッドで、ボタンの タップされたときにユーザーがログインできるようにするOnClickListener
:
<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
Kotlin
findViewById<View>(R.id.sign_in_button).setOnClickListener(this)
Java
findViewById(R.id.sign_in_button).setOnClickListener(this);
ログイン インテントを作成し、ログインフローを開始する
onCLick()
でログインボタンのタップを処理する
メソッドでログイン インテントを作成して、
<ph type="x-smartling-placeholder"></ph>
getSignInIntent()
メソッドを使用します。次に、
<ph type="x-smartling-placeholder"></ph>
startActivityForResult()
メソッドを使用します。
Intent intent = mSignInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN);
ユーザーは、ログインに使用する Google アカウントを選択するよう求められます。スコープをリクエストした場合 プロファイル、メール、オープン ID 以外のリソースの場合、ユーザーはこれらの 説明します。
最後に、アクティビティの
<ph type="x-smartling-placeholder"></ph>
onActivityResult
メソッドを使用し、
<ph type="x-smartling-placeholder"></ph>
getSignInResultFromIntent
。ログイン結果を取得したら、
ログインに成功したかどうかを確認するために、
<ph type="x-smartling-placeholder"></ph>
isSuccess
メソッドを使用します。ログインが成功したら、
<ph type="x-smartling-placeholder"></ph>
getSignInAccount
メソッドを使用して、
<ph type="x-smartling-placeholder"></ph>
ログインに関する情報を含む 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 アプリで操作を行います。
- Wear OS アプリがユーザーに認証画面を表示し、 ユーザーが指定の URL からコードを入力すること。
- ユーザーがモバイル デバイス、タブレット、パソコンのいずれかでブラウザを起動し、 Wear OS アプリで指定された URL に移動してログインします。
- ユーザーに一時的な数値コードが届き、Wear OS アプリに入力する
Wear OS のオンボード キーボードを使用した認証画面:
- この時点から、入力したコードが正しいことを証明できます。 Wear OS デバイスに保存されて保護されている認証トークンとコードを交換します。 認証されます。
注: ユーザーが生成するコードには、英字を含めず数字のみが含まれるようにする必要があります。
次の図はこの認証フローを示しています。