2017-02-16 12 views
1

APIコンシューマーは、特定のAPIポータルでAPIにサブスクライブします。 彼はクライアントIDと臨床検査の秘密を受け取ります。 サブスクリプションに特定のクォータセットがあります。OAuth2ネイティブアプリ - クライアントの秘密

[ハッピーデイシナリオ]

  • 彼はその後、Webアプリケーションを作成することを決定し、サーバ上で安全にクライアントシークレットを配置します。
  • 彼はAuthコードの許可を得ようと決めます。
  • auth_codeを受け取った後にacces_tokenを取得するための呼び出しは、クライアントシークレットを使用したサーバー間要求です。
  • したがって、目的は安全に保存され、使用されるclient_secretで解決されます。彼は以前に加入し、同じAPIを使用しています -

[未幸せな一日のシナリオ]

  • その後、彼はネイティブアプリ(アンドロイド/ iOSアプリパブリッククライアント)を作成することを決定します。
  • ネイティブアプリがAPIにアクセスするには、access_tokenが必要です。
  • ユーザーはIDサーバーに対して認証し、許可を提供します。
  • auth_codeを受信し、アプリにリダイレクトされます。
  • これで、このauth_code +クライアントID + client_secretがaccess_tokenを取得する必要があります。
  • この場合、client_secretは安全に保存されません。アプリをデコンパイルすることができ、APIの購入/ APIの購読を犠牲にして、client_secretを誤用する可能性があります。

暗黙のフローオプションが除外されています。

可能な回避策:

  • のclient_idとclient_secretが格納されており、ネイティブアプリがアクセストークンを得るためにauth_codeでこのプロキシを呼び出すプロキシを作成します。
  • client_secretを暗号化してください。 アドバイスが必要です。

答えて

0

ローカルで使用可能な/ oauth2/authorizeエンドポイント用のAPIを作成することでこれを解決するより良い方法が見つかりました。私のAPIリクエストで、ユーザ名、パスワード、およびクライアントIDを受け入れる有効な場合

  • APIは、DB
  • に対して受け取ったクライアントIDを確認します、のためにclient_secretをフェッチ

    1. :だからここ

      が流れていますクライアントIDからDB

    2. 実行時に、実行時に認証:基本base64(clientID:client_secret)を作成します。スクリプト適合ツールを使用します。
    3. この作成した承認ヘッダーをリクエストに追加します
    4. 実際の/のOAuth2 /認可エンドポイントへのローカル前方
    5. この要求

    これは、パブリッククライアント(ネイティブアプリケーション)でclient_secretを埋め込むないことで完璧に動作し、IマネージャーとしてAPIゲートウェイを私の場合に適合:)

    注:auth_code許可フローでも機能します。