2016-09-02 9 views
3

Azure ADを使用してカスタムAPIに対してMicrosoft cordova-plugin-ms-adal plugin(ネイティブライブラリを使用)を使用しているCordovaモバイルアプリ用にOAuth 2.0を設定しています。これはすべてうまくいきますが、私は秘密の使用(またはより具体的にはその不在)と少し混乱しています。OAuth 2.0認証コードの無償無償提供

ウェブ上の多くの記事では、認証コード付与を使用してトークンを要求するときに、その秘密を含めると述べています。この許可タイプは、秘密を安全に保存できる場合に使用するのに理想的です。サーバー上で

しかし、のプラグインでは、のアプリに秘密が指定されている必要はありませんが、正しく認証するために許可コード許可が使用されます。また、私は手動で、ログイン、私のブラウザで

https://login.windows.net/common/oauth2/authorize?resource=http://***.onmicrosoft.com/***API&client_id=***&response_type=code&redirect_uri=http://***.onmicrosoft.com/***App 

を呼び出すコードを取得し、その後

grant_type: authorization_code 
client_id: *** 
code: *** 
redirect_uri: http://***.onmicrosoft.com/***App 
resource: http://***.onmicrosoft.com/***API 

https://login.windows.net/common/oauth2/tokenに投稿し、それが動作しますので、私はにせずに戻って有効なJWT、を得ることができます秘密をに送信してください。

なぜ!これは安全性が低いですか? (OAuth 2.0 spec section 4.1.3には、認可タイプ認可コードに秘密が必要であると記載されていないことに気がつきました)。

認可タイプの認可タイプを秘密/基本認証ヘッダーなしで使用することの意味は?あなたは、要求が(多分あなたはそれに気づかなかった)も含まれる投稿のリンクで

+0

ブラウザのログインでどのようにコードを取得したのか、Javascriptまたは任意のサーバー側の言語を使用してPOSTを行ったことが分かりますか? 私はこの問題に直面しており、あなたの助けが必要です!!!! –

+0

@SouravDas私はより良い理解を得ることができたので、手動でエンドポイントを呼び出していました。ブラウザで最初のURLを呼び出してログインすると、?code = paramで設定したredirect_uriにリダイレクトされます。トークンエンドポイントにPOSTするときにこの値を使用します - これをテストするためにhttps://www.getpostman.comを使用しました。私の実際のコードでは、私のためにこれを処理するcordova-plugin-ms-adalプラグインのセットアップがあります! – Mac

+0

返事をありがとう。私たちはAZADではなくADFSを使用していますので、私はすべてを書かなければなりません! –

答えて

3

パブリッククライアント(秘密を持っているか、他の方法で認証していない1)でgrant_type=authorization_code(またはその他のフロー)を使用しての意味が付与されたアクセストークンがクライアントの許可を表していないということですリソースには、ユーザーのリソースへの承認のみが示されます。

これは、ネイティブクライアントアプリケーション(パブリッククライアント)を登録すると、アプリケーションのみのアクセス許可ではなく、リソースに委任されたアクセス許可を持つように構成できることに注意します。

1

Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW

したがってclient_secretは本当に必要はありませんでした。どのようにクライアントが認証(必要であれば)を決定するために、サーバ次第だと思われる仕様から

If the client type is confidential or the client was issued client 
credentials (or assigned other authentication requirements), the 
client MUST authenticate with the authorization server as described 
in Section 3.2.1. 
+0

おかげさまでトマース。私は仕様例で気付かなかったことを認めます!私は私の質問は:秘密/基本認証ヘッダーなしでauthorization_codeの付与タイプを使用することの意義は何ですか? (私はこれを反映するために私の質問を更新しました。) – Mac

3

いわゆる機密クライアントと認証コードの助成金を使って(持っているクライアントクライアントシークレット)は、パブリッククライアントを実際に使用するよりも安全です。

これは、認証コードそのものがフロントチャネルのURLパラメータ、つまりブラウザを介して行われるため、クロススクリプト、クリックジャッキ、ネットワーク/ DNS操作などの攻撃に対して比較的脆弱であるためです。これは、専用の攻撃者が、特定の状況(ユーザー、攻撃者のネットワーク制御、サーバーの実装での不正なリダイレクトURIの一致など)でユーザーから認証コードを盗む可能性があることを意味します。

アクセストークンの認証コードを交換するには、機密クライアントは認証コードの横にHTTPS保護された呼び出しでクライアントシークレットを提示する必要がありますが、パブリッククライアントはそれを確実にする手段がありません実際に指定されたクライアントです。

これは、それはそれは唯一の非機密情報(彼は彼自身のブラウザからclient_idredirect_uriをつかむことができます)および承認code彼ができることを必要とするため、パブリッククライアントを模倣するため、攻撃者のための簡単な比較的であることを意味し上記のような攻撃を行います。

機密クライアントの権限コードを取得するのと同じ方法で動作しますが、攻撃者はアクセストークンを使用してアクセストークンと交換することはできません。攻撃者。秘密は通常、バックエンドストレージ内のサーバーに格納され、セキュアなHTTPSチャネルを介してのみ通信されるため、漏洩しません。

関連する問題