明確化:モバイルアプリ=ネイティブアプリ
他のコメントやオンラインのいくつかのソースで述べられているように、暗黙的はモバイルアプリに自然に適合するように見えますが、最善の解決策は必ずしも明確ではありません(実際、暗黙的は以下で説明する理由から推奨されません)。
ネイティブアプリのOAuth2のベストプラクティス
どのアプローチを選択する場合でも(考慮すべきトレードオフがいくつかあります)、OAuth2を使用するネイティブアプリについてここで概説されているベストプラクティスに注意を払う必要があります:https://tools.ietf.org/html/rfc8252
次のオプションを検討してください
暗黙
暗黙的に使用する必要がありますか?
セクション8.2から引用するにはhttps://tools.ietf.org/html/rfc8252#section-8.2
OAuth 2.0の暗黙的な承認承認フロー(OAuth 2.0 [RFC6749]のセクション4.2で定義)は、通常、ブラウザーで承認リクエストを実行し、URIベースのアプリ間通信を介して承認応答を受信する方法で機能します。
ただし、暗黙的なフローはPKCE [RFC7636](セクション8.1で必要)では保護できないため、ネイティブアプリで暗黙的なフローを使用することはお勧めしません。
暗黙的なフローを介して付与されたアクセストークンも、ユーザーの操作なしでは更新できないため、認証コードの付与フロー(更新トークンを発行できます)は、アクセストークンの更新を必要とするネイティブアプリ認証のより実用的なオプションになります。
認証コード
認証コードを使用する場合、1つのアプローチは、トークン要求をクライアントシークレットで強化して、デバイス上の分散アプリに保存されないようにする独自のWebサーバーコンポーネントを介してプロキシすることです。
以下からの抜粋:https://dev.fitbit.com/docs/oauth2/
Webサービスを備えたアプリケーションには、認証コード付与フローをお勧めします。このフローでは、アプリケーションのクライアントシークレットを使用したサーバー間通信が必要です。
注:アプリストアからダウンロードしたアプリやクライアント側のJavaScriptなど、分散コードにクライアントシークレットを入れないでください。
Webサービスを持たないアプリケーションは、ImplicitGrantフローを使用する必要があります。
結論
最終的な決定では、最終候補のアプローチの適切なリスク評価を行い、その影響をよりよく理解した後、目的のユーザーエクスペリエンスだけでなく、リスク選好も考慮に入れる必要があります。
すばらしい読み物はここにありますhttps://auth0.com/blog/oauth-2-best-practices-for-native-apps/
もう一つはあるhttps://www.oauth.com/oauth2-servers/oauth-native-apps/いる状態
現在の業界のベストプラクティスは、クライアントシークレットを省略して承認フローを使用し、外部ユーザーエージェントを使用してフローを完了することです。外部ユーザーエージェントは通常、デバイスのネイティブブラウザーであり(ネイティブアプリとは別のセキュリティドメインを使用)、アプリはCookieストレージにアクセスしたり、ブラウザー内のページコンテンツを検査または変更したりできません。
PKCEの考慮事項
https://www.oauth.com/oauth2-servers/pkce/で説明されているPKCEも検討する必要があります
具体的には、承認サーバーも実装している場合は、https: //www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/に、
- クライアントがリダイレクトURLのカスタムURLスキームを登録できるようにします。
- デスクトップアプリをサポートするために、任意のポート番号を持つループバックIPリダイレクトURLをサポートします。
- ネイティブアプリが秘密を守ることができると思い込まないでください。すべてのアプリに、公開か機密かを宣言するように要求し、機密アプリにのみクライアントシークレットを発行します。
- PKCE拡張機能をサポートし、パブリッククライアントがそれを使用することを要求します。
- 承認インターフェースがシステムブラウザーで起動されるのではなく、ネイティブアプリのWebビューに埋め込まれていることを検出し、それらの要求を拒否しようとします。
Webビューに関する考慮事項
Webビュー、つまり埋め込みユーザーエージェントを使用する実際の例はたくさんありますが、このアプローチは避ける必要があり(特にアプリがファーストパーティでない場合)、場合によってはAPIを抜粋として使用することが禁止される可能性があります下記のここ実証
OAuth 2.0認証ページを埋め込もうとすると、アプリケーションがFitbitAPIから禁止されます。
セキュリティ上の理由から、OAuth2.0認証ページは専用のブラウザビューで表示する必要があります。Fitbitユーザーは、URLバーやトランスポート層セキュリティ(TLS)証明書情報など、ブラウザーが提供するツールを使用している場合にのみ、本物のFitbit.comサイトで認証されていることを確認できます。
ネイティブアプリケーションの場合、これは認証ページをデフォルトのブラウザで開く必要があることを意味します。ネイティブアプリケーションは、リダイレクトURIとしてカスタムURLスキームを使用して、ユーザーをブラウザーからアクセス許可を要求するアプリケーションにリダイレクトできます。
iOSアプリケーションは、アプリをSafariに切り替える代わりに、SFSafariViewControllerクラスを使用する場合があります。WKWebViewまたはUIWebViewクラスの使用は禁止されています。
Androidアプリケーションは、アプリをデフォルトのブラウザに切り替える代わりにChromeカスタムタブを使用する場合があります。WebViewの使用は禁止されています。
さらに明確にするために、上記のベストプラクティスリンクの以前のドラフトのこのセクションからの引用を次に示します。
一般にWebビューで実装される埋め込みユーザーエージェントは、ネイティブアプリを承認するための代替方法です。ただし、定義上、サードパーティによる使用は安全ではありません。これには、ユーザーが完全なログイン資格情報を使用してサインインする必要がありますが、それは、それほど強力ではないOAuth資格情報にダウンスコープするためだけです。
信頼できるファーストパーティアプリで使用されている場合でも、埋め込まれたユーザーエージェントは、必要以上に強力な資格情報を取得することで最小特権の原則に違反し、攻撃対象領域を増やす可能性があります。
埋め込みユーザーエージェントの一般的なWebビューベースの実装では、ホストアプリケーションは次のことができます。フォームに入力されたすべてのキーストロークをログに記録して、ユーザー名とパスワードを取得します。フォームを自動的に送信し、ユーザーの同意をバイパスします。セッションCookieをコピーし、それらを使用してユーザーとして認証されたアクションを実行します。
通常のアドレスバーやブラウザが備えているその他のID機能を使用せずに、埋め込みWebビューに資格情報を入力するようユーザーに促すと、ユーザーは正規のサイトにサインインしているかどうかを知ることができなくなり、サインインしている場合でもトレーニングを受けます。最初にサイトを検証せずに資格情報を入力しても問題ないこと。
セキュリティ上の懸念は別として、Webビューは認証状態を他のアプリやシステムブラウザと共有しないため、ユーザーはすべての承認リクエストにログインする必要があり、ユーザーエクスペリエンスが低下します。
上記の理由により、信頼できるファーストパーティアプリが他のアプリの外部ユーザーエージェントとして機能する場合、または複数のファーストパーティアプリにシングルサインオンを提供する場合を除いて、埋め込みユーザーエージェントの使用は推奨されません。
承認サーバーは、可能であれば、独自のものではない組み込みユーザーエージェントを介してログインを検出およびブロックするための措置を講じることを検討する必要があります。
いくつかの興味深い点もここで提起されています:https://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- a