Android で Microsoft Edge 用の SPNEGO Authenticator を作成する
サード パーティは、Microsoft Edge for Android で SPNEGO 認証を有効にすることができます。 この認証を提供するには、SPNEGO Authenticator を提供する必要があります。 この記事では、Edge と SPNEGO Authenticator の間のインターフェイスについて説明します。
概要
SPNEGO Authenticator は Android サービスによって提供されます。 認証子は、ユーザーのデバイスにインストールされているサード パーティが提供するアプリに組み込む必要があります。 アプリは、SPNEGO 認証と SPNEGO サーバーとのすべての通信に使用されるすべてのアカウントを管理する責任を負います。
SPNEGO Authenticator は Android AccountAuthenticator です。 そのため、 AbstractAccountAuthenticator で説明されているパターンに従う必要があります。 AbstractAccountAuthenticator
から派生した認証子クラスを実装する必要があります。
SPNEGO Authenticator は、新しいアカウントの種類を定義する必要があります。 アカウントの種類名は、ライターのドメイン名 (com.example.spnego など) から派生する必要があります。 アカウントの種類は customTokens を使用するように定義する必要があり、"SPNEGO" 機能 (HttpNegotiateConstants.SPNEGO_FEATURE) をサポートする必要があります。
Microsoft Edge へのインターフェイス
Edge は、提供する Android アカウントの種類を使用して SPNEGO 認証子を検索します。 認証子によって定義されたアカウントの種類は、 AuthAndroidNegotiateAccountType ポリシーを介して Edge に渡されます。
Edge へのインターフェイスは、Android アカウント管理フレームワーク、 AbstractAccountManager.getAuthToken を使用しています。 edge、org.chromium.net.HttpNegotiateConstants では、getAuthToken
する引数と、返される結果バンドルで使用されるいくつかのキーと値が定義されています。
getAuthToken 引数
getAuthToken が呼び出されると、authTokenType
は "SPNEGO:HOSTBASED:<spn>" で<spn>が要求のプリンシパルになります。 これは、現在の実装では常にホスト ベースのプリンシパルになります。 将来のバージョンでは他の種類のプリンシパルが許可される場合がありますが、その場合は別のプレフィックスが使用されます。 SPNEGO Authenticators はプレフィックスを確認する必要があります。
options
バンドルには、次のキーが含まれています。
- KEY_CALLER_PID
- KEY_CALLER_UID
HttpNegotiateConstants.KEY_CAN_DELEGATE
- 委任が許可されている場合は True、許可されていない場合は false。
これが複数ラウンド認証シーケンスの 2 回目以降のラウンドである場合は、次のキーも含まれます。
HttpNegotiateConstants.KEY_INCOMING_AUTH_TOKEN
- base64 でエンコードされた WWW-Authenticate ヘッダーからの受信トークン。HttpNegotiateConstants.KEY_SPNEGO_CONTEXT
- 前のラウンドで認証子によって提供された SPNEGO コンテキスト。 Microsoft Edge では、このバンドルを不透明なオブジェクトとして扱い、ラウンド間で保持するだけです。
getAuthToken 結果バンドル
getAuthToken の最終的な結果バンドル (getAuthToken
の戻り値として、または AccountAuthenticatorResponse を介して返されます) には、Android ドキュメントで定義されているアカウント名、アカウントの種類、トークンが含まれている必要があります。 さらに、バンドルには次のキーが含まれている必要があります。
HttpNegotiateConstants.KEY_SPNEGO_RESULT
- SPNEGO の結果コード。 これは、 HttpNegotiateConstants で定義されている値のいずれかである必要があります。HttpNegotiateConstants.KEY_SPNEGO_CONTEXT
- 次の認証ラウンドで認証子に返されるコンテキスト。 これは、認証が不完全な場合にのみ必要です。
実装に関する推奨事項
SPNEGO 認証子を実装する場合は、次の推奨事項を考慮する必要があります。
SPNEGO アカウント認証システムによって提供される各アカウントは、1 つのキー配布センターによって提供される 1 つのユーザー プリンシパル (アカウント) に対応する必要があります。
アカウント認証子にはパスワードを格納しないでください。 代わりに、ユーザー プリンシパルの TGT を格納し、TGT の有効期限が切れたときにパスワード (またはその他の認証データ) を再入力する必要があります。
アカウント認証子は、アカウントごとに承認されたアプリケーション (またはアプリケーション署名) の一覧を保持し、他のアプリケーションへのサービス トークンの提供を拒否する必要があります。 承認されたアプリケーションの一覧は次のとおりです。
- アカウント認証子に組み込まれています。
- システム管理者が構成できます。
- ユーザーが構成できます。 この場合、アカウント認証子は、ユーザーが最初にアクセスを要求するときに、新しいアプリケーションを動的に承認することを許可することを選択する場合があります。
認証子は、オプション バンドルの [KEY_CALLER_UID] フィールドを使用して呼び出し元アプリの uid を取得し、
context.getPackageManager().getNameForUid()
または同様の呼び出しを使用して要求元のアプリケーションを識別できます。これは、ユーザーが実行する悪意のあるアプリが、ユーザーの資格情報を使用して意図しない方法でサービスにアクセスできないようにするために必要です。 これは、(前に説明したように) カスタム トークン オプションを使用すると、認証トークンを取得するときに Android 独自の署名チェックが無効になるため、重要です。
アカウント認証子に組み込まれている場合を除き、システム管理者またはユーザーはキー配布センターの場所を構成できる必要があります。
Microsoft Edge に表示されるエラー コード
認証アプリから転送できるエラー コードに加えて、要求を認証しようとすると、次のエラーが表示される場合があります。
- ERR_MISSING_AUTH_CREDENTIALS: アカウント情報は使用できません。 これは、次のいずれかの理由で発生させることができます。
- ユーザーが認証アプリにログインせず、適格なアカウントが見つかりませんでした。
- 現在のアプリに必要なアクセス許可がないため、アカウント情報を取得できません。
- 対象となるアカウントが複数あり、ユーザーから選択を取得できません。
- ERR_UNEXPECTED: 予期しないエラーが発生し、要求が終了しました。
- ERR_MISCONFIGURED_AUTH_ENVIRONMENT: アプリの構成に問題があるため、認証を完了できません。 一部のアクセス許可が見つからない可能性があります。
Logcat を使用して、システム ログ内のcr_net_auth タグを検索して、これらのエラーの原因の詳細を取得します。
Microsoft Edge で認証子を使用する
Edge では 、SPNEGO 認証の使用を制御するためにいくつかのポリシーが使用されます。 SPNEGO 認証を有効にするには 、AuthServerAllowList を構成し、 AuthAndroidNegotiateAccountType が SPNEGO 認証子によって提供されるアカウントの種類と一致している必要があります。
コンテンツ ライセンス
注
このページの一部の情報は、Chromium.org によって作成および共有されている著作物に基づいており、Creative Commons Attribution 4.0 International License に記載されている条項に従って使用されています。 元のページはこちらです。
この著作物は、Creative Commons Attribution 4.0 International License に従って使用許諾されています。