web-dev-qa-db-ja.com

OAuth2のクライアント側JSライブラリはどのように安全な認証を維持しますか?

私はOAuth2を初めて使用しますが、苦労してきた問題がありますが、研究はまだ理解できません。

OAuth2用のJSクライアントを持つことの難しさは、ブラウザで広くアクセスできるため、クライアントシークレットを保存できないことです。つまりin this SO question 最も評価の高いコメントは次のとおりです。

「tokenSecretおよびconsumerSekretパラメータは秘密であると考えられます。ブラウザにダウンロードしたときに、どのようにして秘密のままにすることができますか?!!!」

したがって、 hello.js または oauth.io のようなクライアント側のOAuth2フレームワークは、この問題をどのように克服しますか?リクエストにサーバー側プロキシ(IDとシークレットを知っている)を使用していることは知っていますが、クライアントのJSコードは、プロキシが何であるかをプロキシに伝える必要があります。だから、だれかが私のWebサイトからJSコードを取得し、私に代わってプロキシと通信することを妨げるものは何ですか?

JavaScript用Google APIクライアントライブラリ も見つかりました。知る限りでは、クライアントコードは秘密を渡しません。事前定義されたOAuth応答アドレスを持つことでこれを管理していることを正しく理解していますか(トークンは常に事前定義されたHTTPアドレスを介して返されます)。 IDを使用しても、トークンは引き続きWebサイトに返されますか?

ここでいくつかの異なるトピックを混同しているのかもしれませんが、この主題に関するどんな光でも歓迎されます。

32
machinery

OAuth2にはシークレットを必要としないフローがあります(たとえば、implicitフローは通常、JSベースのクライアント、SPAなどに使用されます)。ただし、すべてのプロバイダーがこのフローをサポートしているわけではないため、そのような状況では、それをネゴシエートし、フロントエンド/デバイスとのやり取りを処理するサーバー側コンポーネントが必要です。

いずれにせよ、ユーザーは認証を受ける必要があります。 secretは、ユーザーではなくクライアント(アプリ)を認証します。戻りURL(またはコールバック)は、トークンが他の場所(アプリのみ)に投稿されるのを防ぎます。

これらのフローのサンプルはこちらです: https://docs.auth0.com/protocols#5

更新:「パブリッククライアント」用の特別なコード/トークン交換プロトコルがあり、セキュリティをさらに強化します:PKCE(動作方法はこちら: https://auth0.com/docs/protocols#oauth2-pkce-for-public-clients

21
Eugenio Pace

JSクライアントの場合、Googleは、JS OriginがクライアントIDで登録されたものと一致することを検証します。そのため、誰かが他の誰かのクライアントIDを使用する場合、多くても自分が所有するアカウントのみのトークンを取得できます(あまり有用ではありません)。

一般的に、誰とどのクライアント(またはコード)がサーバーと通信しているかを知ることはできません。送信したデータのみが表示されます。したがって、同じパケットが他のクライアント/コードによって送信された場合、あなたができることは何もありませんし、一般的には気にする必要はありません。リクエストに適切な資格情報があることに注意する必要があります。

4
nvnagr