2017-06-14 13 views
0

私は、Androidアプリケーション(クライアント)から使用されるOAuth2のSpringでセキュリティ保護されたREST APIを開発中です。私のAPIの任意のエンドポイントにアクセスするためには、のOAuth2アクセストークンが必要とされ、これと同様の方法で認証ヘッダー経由でエンドポイントに引き渡さ:OAuth2クライアントIDとクライアントの秘密のセキュリティ

「承認」 -

を「ベアラがaccesstokenhere」

アクセストークンを取得するには、クライアントIDとクライアントシークレット(Androidアプリを表す)とユーザー名とパスワードを入力する必要があります。

: - 「clientSecret基本のclientId」

「認可」:クライアントIDとクライアントシークレットは春で指定されているこれと同様の方法で認証ヘッダーを介したトークンエンドポイントに引き渡されクライアントIDとクライアントシークレットがサーバー上で定義されたクライアントと一致し、ユーザーが存在し、パスワードが正しい場合は、アクセストークンと更新トークンが返されます。

私の質問はです。私のクライアントIDとクライアントの秘密をAndroidアプリケーション内に安全に保存する方法、私のアプリケーションをリバースエンジニアリングする人にはアクセスできないようにしていますか?

また、iOSアプリケーション(第2のクライアント)を開発する場合、セキュリティPOVから別のclientIDとクライアントシークレットを使用することをお勧めしますか?

+0

、詳細についてはAppAuth for Androidを見てください秘密を隠すことはできません。https://stackoverflow.com/a/43391526/5277820およびhttps://stackoverflow.com/questions/44044528/how-to-secure-oauth-2-0-clientも参照してください。 -idおよびクライアント秘密。 – dur

答えて

2

方法があっても、ワイヤのペイロードを検査して値を決定することはできません。 1人のユーザーが自分のコピーを検査し、共有秘密を学ぶこととして、静的に機密秘密として扱われるべきではない複数のユーザーに配布アプリの一部として含まれているOAuth 2.0 for Native Apps

秘密のセクション8.5を参照してください。このため、[RFC6819]の5.3.1項に記載されているように、共有秘密を使用するパブリックネイティブアプリクライアントのクライアント認証をクライアントに要求することは推奨されていません。クライアント識別以外の価値はほとんどありません。
すでに "client_id"リクエストパラメータによって提供されています。

お客様のクライアントID /シークレットパラメータは、リクエストを行うアプリケーションのIDを提供するだけです。そのため、iOSアプリケーションに異なるクライアントを作成することをお勧めします。 +あなたのアプリケーションの使用について収集したいアナリティクス(例えば、「クライアントIDで何回ログインしようとしていますか?」など)

しかし、脅威の俳優は設定をリバースエンジニアリングして、 +秘密とあなたのアプリケーションを強引にしようとすると、ユーザー名とパスワードの組み合わせでトークンのエンドポイントを打つことを開始します。エンドポイントがこれらの値を受け入れて成功/失敗のコードを返す場合、これはシステムを侵害しようとする人にとって有益な攻撃方法です。

現在推​​奨されるアプローチは、「認証コードフロー」を使用することです

ネイティブアプリケーションでユーザーを認証するための最良の現在の慣行は にある(通常は外部のユーザーエージェントでのOAuth認証要求を行いますブラウザ)ではなく、埋め込まれたユーザーエージェント(Webビューで実装されたエージェントなど)である必要があります。

以前は、ネイティブアプリでOAuth 認証リクエストの埋め込み ユーザエージェント(通常はウェブビューで実装)を使用するのが一般的でした。その方法には多くの欠点があります。 ホストのアプリがユーザーの資格情報と のCookieをコピーできるようにし、各 アプリでスクラッチから認証する必要があるユーザーを含みます。 OAuthのた​​めに埋め込まれた ユーザーエージェントを使用してのより深い分析のために、セクション8.12を参照してください。」

にするので、あなたのクライアントは、どのクライアントの秘密を必要としない公共のクライアントです

関連する問題