HTMLとJavaScriptを使用して開発された単一ページのクライアント側アプリケーションについて考えてみましょう。
この場合、暗黙的または認証コードフローを使用してAccess Tokesを要求している場合でも、トークン要求を行っている可能性のあるJavascriptでclientIDとSecretが引き続き見つかります。さらに、リクエストヘッダー(またはクエリパラメーター)でアクセストークンを渡しても、ネットワークトレースに表示されます。さらに、アクセストークンはブラウザのローカルに保存する必要があります。
ありがとう。
oAuth2プロトコルに関してこのクライアント側アプリケーションを処理する方法に関する最近のガイダンスがあります: https://tools.ietf.org/html/draft-ietf-oauth-security-topics-11
TL; DR:PKCEを使用したOAuth2認証コードを先頭に配置することをお勧めします。実装の詳細については、この非常に優れた記事のみをお勧めします: https://auth0.com/blog/oauth2-implicit-grant-and-spa/
通常OAuthは、OAuthフレームワークのクライアントであるサードパーティにリソースへのアクセス権を付与するためにユーザーによって使用されます。したがって、暗黙的なフローではユーザーにはアクセストークンが表示される場合がありますが、最初からアクセスできるため、問題ありません。
ただし、より安全な方法は、暗黙のフローを使用しないことです。これにより、アクセストークンを取得するためにクライアント資格情報と組み合わせる必要があるアクセスコードが提供されます。ユーザーのブラウザでJavaScriptを使用してこれを行うことはありません。代わりに、サーバー側のソフトウェアでアクセスコードをキャプチャし、認証サーバーへのバックチャネル呼び出しを行ってアクセストークンを取得します。これで、ユーザーや他の誰かが実際にアクセスして取得するのに十分な情報を入手することはありません。
したがって、手順は次のようになります。
上記のステップでは、ユーザーの部分はステップ3の後に行われます。そのため、ユーザーのブラウザーに依存してJavaScriptの実行を完了する必要はありません。これにより、説明したようにセキュリティの問題が発生するだけでなく、ステップ4、5、6の実行が不確実になり、長い処理タスクに固執する必要がある場合は、ユーザーエクスペリエンスが低下する可能性があります。代わりに、ユーザーが関与する必要なく、すべてをバックエンドで実行できます。
OAuthを正しく実装すれば、非常に安全な方法で認証できます。
すべてがJavaScriptである場合、ブラウザーを信頼することができないため、パブリックエンドポイント(client_secretなし)を使用することをお勧めします。実際には、ユーザー名/パスワードをCookieと交換することと何の違いもありません。