OAuth 2.0には複数のワークフローがあります。 2つに関していくつか質問があります。
セキュリティの観点から2つのアプローチの違いは何ですか?どちらがより安全で、なぜですか?
サーバーがアクセストークンを直接発行できる場合、1つのワークフローに余分な手順(トークンの認証コードを交換する)が追加される理由はわかりません。
さまざまなWebサイトは、クライアントアプリが資格情報を安全に保持できる場合に承認コードフローが使用されると述べています。どうして?
access_token
は、保護されたリソース(API)を呼び出すために必要なものです。承認コードフローには、取得するための2つのステップがあります。
code
をAPIコンシューマー(「クライアント」と呼ばれる)に返す必要があります。code
をaccess_token
と交換し、client_id
およびclient_secret
で認証します。access_token
を使用してAPIを呼び出すことができます。そのため、二重チェックがあります:APIを通じて表示されるリソースを所有するユーザーと、APIを使用するクライアント(Webアプリなど)です。両方とも、アクセスが許可されるために検証されます。ここでOAuthの「承認」の性質に注意してください。ユーザーは、(認証後に返されるcode
を介して)自分のリソースへのアクセスをアプリに許可し、アプリはaccess_token
を取得し、呼び出しますユーザーに代わって。
暗黙のフローでは、ステップ2は省略されます。そのため、ユーザー認証後、access_token
が直接返され、これを使用してリソースにアクセスできます。 APIは、だれがそのAPIを呼び出しているかを知りません。 access_token
を持っている人は誰でもできますが、前の例ではWebアプリのみができます(通常、内部には誰もアクセスできません)。
通常、暗黙フローは、client id
およびclient secret
の保存が推奨されないシナリオで使用されます(たとえば、多くの場合、デバイスはそうしますが)。それが免責事項の意味です。ユーザーはクライアントコードにアクセスできるため、資格情報を取得し、リソースクライアントになるふりをすることができます。暗黙のフローでは、すべてのデータは揮発性であり、アプリには何も保存されません。
上記の回答で明らかにされていないと思うものをここに追加します:
tl; drトークンを保持するためにユーザーマシンを信頼していないが、do信頼している場合、暗黙のフローを使用しない独自のサーバー。
両者の違いは次のとおりです。
暗黙的なフローでは、トークンは「#」記号付きのリダイレクトURLを介して直接返され、これは主にJavaScriptクライアントまたは独自のサーバー側を持たないモバイルアプリケーションで使用され、クライアントは一部の実装で秘密を提供する必要はありません。
承認コードフローでは、コードは「?」で返されますサーバー側で読み取り可能にするために、サーバー側は今度はトークンURLにクライアントシークレットを提供して、承認サーバーからjsonオブジェクトとしてトークンを取得する必要があります。これを処理できるアプリケーションサーバーがあり、ユーザートークンを自分のシステムに自分のプロファイルとともに保存する場合に使用され、主に一般的なモバイルアプリケーションに使用されます。
そのため、クライアントアプリケーションの性質に依存します。これは、クライアント上でシークレットをリクエストし、非常にセキュアな接続で認証サーバーとクライアントアプリケーション間でトークンを送信できるため、より安全な「認証コード」一部のクライアントが「認証コード」のみを使用するように制限し、暗黙的を許可しない
暗黙の許可は、2つの明確な違いを除いて、許可コードの許可に似ています。
すべてのアプリケーションコードとストレージに簡単にアクセスできるため、クライアントを秘密にできないユーザーエージェントベースのクライアント(シングルページウェブアプリなど)で使用することを目的としています。
次に、認可サーバーがアクセストークンと交換される認可コードを返す代わりに、認可サーバーがアクセストークンを返します。
詳細はこちらをご覧ください http://oauth2.thephpleague.com/authorization-server/which-grant/
上記の回答から学んだポイントを要約し、私自身の理解の一部を追加しましょう。
引用: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
実用的な観点(私が理解したこと)から、Authzコードフローを持つ主な理由は次のとおりです。
「認可サーバーは(ユーザーエージェントを介して)リソース所有者を認証し、リソース所有者がクライアントのアクセス要求を許可するか拒否するかを確立します。」
それとは別に、更新トークンを使用して、アプリはユーザーデータへの長期アクセスを取得できます。