web-dev-qa-db-ja.com

セキュアOAuthクライアント側またはモバイルアプリの2フロー

私はAPIとクライアント側のウェブアプリを実装しています。それらはAPI経由で通信し、認証にOAuth 2を使用することになっています。

ユーザーを認証するための正しい方法(つまり、主要なセキュリティの監視がない場合)についての混乱を克服することはできません。

私は次のものを集めました:

  • 理想的には、ユーザー名とパスワードを受け取り、認証コードでリダイレクトするAPIサーバー上でWebフォームを公開し、クライアント側でアクセストークンアクセストークンと交換する必要があります。
  • 私が説明したアプローチは扱いにくいと考えられているため、OAuth 2は、クライアント側のアプリがclient_idとそれが収集するユーザーの資格情報を含むリクエストを作成する暗黙のフローを提供します。アクセストークンを受け取ります。 。
  • 認証ツールキットは、client_idのみを渡して、代わりに client_secretを含める必要があります。
  • 前のポイントに基づいて、開発者はclient_secretを配布可能なアプリケーションに埋め込んで、公開する必要がある場合があります。
  • OAuth 2を理解している一部のピアは、開発者が配布物にclient_secretを埋め込むことは珍しいことではなく、一部の注目を集めるサービス(Twitterとも呼ばれます)も同様にそうしていると教えてくれました。
  • クライアントとOAuth 2サーバーの間にプロキシを追加してclient_secretをリ​​クエストに追加すると、client_secretを完全に無視するのと同じように、セキュリティは向上しません。
  • クライアントにclient_idおよびclient_secretを埋め込むことに関連して私が見つけることができる唯一のセキュリティ上の懸念は、攻撃者が独自のクライアントを実装し、ユーザーの資格情報が与えられると、ユーザーに代わって動作する可能性があることです。フィッシングは類似しており、より大きな利益をもたらすため、これは攻撃の可能性は低いと思われます。

次の質問にはまだ答えがありません。

  1. クライアント資格情報フローリソース所有者パスワードフロー の違いは何ですか?どっちがいい? この質問 への回答では、違いを明確に理解できません。
  2. インプリシットフローの使用にセキュリティ上の大きな懸念はありますか、それとも実行可能ですか?
  3. client_secretの埋め込みは安全ですか?
    • そうでない場合、代替手段は何ですか?それでもclient_idが必要ですか、それとも「パブリック」(未登録)クライアントの使用を許可する必要がありますか?
6

まず、1つ明確にしておきましょう。OAuth2は承認であるため、これを覚えておいてください。

次に、さらに物事を定義してみましょう:

リソース所有者

これらは、FB経由でログインしたいSnapchatなどへのアクセスを許可するときに使用する資格情報です。

クライアント資格情報

これは、クライアントを識別する資格情報です。たとえば、モバイルアプリやブラウザ内アプリケーションなどです。たとえば、承認されたインスタントチャットアクセスで承認されたSnapchatアクセスを使用することはできません。

  • FB経由でSnapchatにログインします。
  • Snapchatを認証または承認するためにFBにリダイレクトされます。アプリは、リソース(IE FBプロファイル)にアクセスするためのアクセス許可を要求しています。
  • あなたは承認し、SnapchatがFBに許可を送信します。これにより、Snapchatに友達トークンリストへのアクセスに使用できるアクセストークンが付与されます。

暗黙的なフローに関するセキュリティ上の懸念

関連するセキュリティ上の懸念があります。あなたはそれが議論されているのを見ることができます here on SO and here on Thread Safe。一般的に、それは実行可能なプラクティスであり、一部の(すでに頭に浮かんでいるはずの)セキュリティのベストプラクティス。

最後に、埋め込みキーに

しないでください。この問題について、 this stormpathブログエントリを紹介します。これは主にJWTに関連していますが、Oauth2に適用されます。

1
Shane Andrie

モバイルでクライアントシークレットを保存するのは安全ではないため、質問3に取り組みます。

私には解決策はありませんが、client_secretをモバイルデバイスに保存するリスクを軽減できる別の方法を説明します。

代わりに、クライアント資格情報の代わりにインストール資格情報を使用することもできます。クライアント資格情報には、インストール資格情報との親関係があります。

クライアント資格情報1
インストール資格情報1
インストール認証情報2 ....

この考え方は、セキュリティチャネルバックエンドを使用して、インストール資格情報を生成することです。 APP資格情報を受け取り、インストールIDを返すサービスを作成する必要があります。さらに、モバイルアプリケーションの所有者は、ユーザーがインストール資格情報を要求するサービスを作成する必要があります。

基本的に、

モバイルアプリ->バックエンド(モバイルアプリ所有)->バックエンド(OAuth所有者)

このソリューションは問題を解決しませんが、秘密を漏らすリスクを軽減します。インストール認証情報を取得し、それをOAuthフローで使用できます。シークレットを取得した場合、1人のユーザーしか偽装できます。攻撃は拡大しません。

1
Oximer