私はAPIとクライアント側のウェブアプリを実装しています。それらはAPI経由で通信し、認証にOAuth 2を使用することになっています。
ユーザーを認証するための正しい方法(つまり、主要なセキュリティの監視がない場合)についての混乱を克服することはできません。
私は次のものを集めました:
client_id
とそれが収集するユーザーの資格情報を含むリクエストを作成する暗黙のフローを提供します。アクセストークンを受け取ります。 。client_id
のみを渡して、代わりに client_secret
を含める必要があります。client_secret
を配布可能なアプリケーションに埋め込んで、公開する必要がある場合があります。client_secret
を埋め込むことは珍しいことではなく、一部の注目を集めるサービス(Twitterとも呼ばれます)も同様にそうしていると教えてくれました。client_secret
をリクエストに追加すると、client_secret
を完全に無視するのと同じように、セキュリティは向上しません。client_id
およびclient_secret
を埋め込むことに関連して私が見つけることができる唯一のセキュリティ上の懸念は、攻撃者が独自のクライアントを実装し、ユーザーの資格情報が与えられると、ユーザーに代わって動作する可能性があることです。フィッシングは類似しており、より大きな利益をもたらすため、これは攻撃の可能性は低いと思われます。次の質問にはまだ答えがありません。
client_secret
の埋め込みは安全ですか?client_id
が必要ですか、それとも「パブリック」(未登録)クライアントの使用を許可する必要がありますか?まず、1つ明確にしておきましょう。OAuth2は承認であるため、これを覚えておいてください。
次に、さらに物事を定義してみましょう:
リソース所有者
これらは、FB経由でログインしたいSnapchatなどへのアクセスを許可するときに使用する資格情報です。
クライアント資格情報
これは、クライアントを識別する資格情報です。たとえば、モバイルアプリやブラウザ内アプリケーションなどです。たとえば、承認されたインスタントチャットアクセスで承認されたSnapchatアクセスを使用することはできません。
例
暗黙的なフローに関するセキュリティ上の懸念
関連するセキュリティ上の懸念があります。あなたはそれが議論されているのを見ることができます here on SO and here on Thread Safe。一般的に、それは実行可能なプラクティスであり、一部の(すでに頭に浮かんでいるはずの)セキュリティのベストプラクティス。
最後に、埋め込みキーに
しないでください。この問題について、 this stormpathブログエントリを紹介します。これは主にJWTに関連していますが、Oauth2に適用されます。
モバイルでクライアントシークレットを保存するのは安全ではないため、質問3に取り組みます。
私には解決策はありませんが、client_secretをモバイルデバイスに保存するリスクを軽減できる別の方法を説明します。
代わりに、クライアント資格情報の代わりにインストール資格情報を使用することもできます。クライアント資格情報には、インストール資格情報との親関係があります。
クライアント資格情報1
インストール資格情報1
インストール認証情報2 ....
この考え方は、セキュリティチャネルバックエンドを使用して、インストール資格情報を生成することです。 APP資格情報を受け取り、インストールIDを返すサービスを作成する必要があります。さらに、モバイルアプリケーションの所有者は、ユーザーがインストール資格情報を要求するサービスを作成する必要があります。
基本的に、
モバイルアプリ->バックエンド(モバイルアプリ所有)->バックエンド(OAuth所有者)
このソリューションは問題を解決しませんが、秘密を漏らすリスクを軽減します。インストール認証情報を取得し、それをOAuthフローで使用できます。シークレットを取得した場合、1人のユーザーしか偽装できます。攻撃は拡大しません。