2017-12-19 13 views
0

私はSalesForce API(a.k.a.A SalesForce "Connected App")を使用するAngularアプリを開発しています。 oAuth/OpenIDを介して認証が行われ、正常に動作します。しかし、アプリは現在ので、正常にSalesforceのAPIエンドポイントにアクセスすることはできません:それは、サーバレスのアプリだプロバイダが承認ヘッダーがないためにフライト前のリクエストを拒否したときにクライアントサイドCORSを機能させる

  1. とREST呼び出しは、クライアント側
  2. REST呼び出しを作っている「非シンプル」です:カスタムヘッダー(oAuthアクセストークンを保持する「Authorization」ヘッダー)が含まれているため、ブラウザはプレフライトOPTIONS要求を発行します。
  3. Salesforceは、定義によって確かに最初のGETリクエスト(全体からカスタムヘッダーが含まれていない飛行前、を含むを有効「認可」ヘッダーとトークンが含まれていない任意のAPIリクエストを拒否事前飛行のポイントは、問題のカスタムヘッダーを許可するかどうかをサーバーに問い合わせることです)。

クライアントアプリケーションURLは、SalesForceセットアップのCORS起点ホワイトリストに追加されています。

これは私を完全に詰まらせます。 oAuthトークンをエンドポイントに送信する唯一の方法は、安全ではないURLパラメータにあるため、カスタムの「Authorization」ヘッダーをREST呼び出しから削除することで、プレ・フライトを回避することはできません。サーバーレスのアプリであるため、自分のバックエンド(つまり、フロントエンドのCORSの制限を回避する)でリクエストをプロキシすることはできません。それはブラウザのコントロール下にあり、ヘッダーを変更する方法がないため、私はSalesForceにプリフライトを受け入れることができません。

「認可」ヘッダーなしで、飛行前のOPTIONS要求を受け入れるようにSalesForceを設定または強制する方法はありますか?もしそうでなければ、このキャッチ22から抜け出すための他の方法があるかもしれませんか?以下

コード例である:

XHR要求:上記から得test.salesforce.com:443

{ 
    "url": "https://test.salesforce.com/services/oauth2/userinfo", 
    "body": null, 
    "reportProgress": false, 
    "withCredentials": false, 
    "responseType": "json", 
    "method": "GET", 
    "headers": { 
    "normalizedNames": [ 
     { 
     "key": "accept", 
     "value": "Accept" 
     }, 
     { 
     "key": "authorization", 
     "value": "Authorization" 
     } 
    ], 
    "lazyUpdate": null, 
    "headers": [ 
     { 
     "key": "accept", 
     "value": ["application/json"] 
     }, 
     { 
     "key": "authorization", 
     "value": ["Bearer [...]"] // OAuth token is here 
     } 
    ], 
    "lazyInit": null 
    }, 
    "params": { 
    "updates": null, 
    "cloneFrom": null, 
    "encoder": { HttpUrlEncodingCodec }, 
    "map": null 
    }, 
    "urlWithParams": "https://test.salesforce.com/services/oauth2/userinfo" 
} 

プリフライト要求:プリフライト要求に

OPTIONS /services/oauth2/userinfo HTTP/1.1 
Host: test.salesforce.com 
Connection: close 
Pragma: no-cache 
Cache-Control: no-cache 
Access-Control-Request-Method: GET 
Origin: [...] // client app URL is here 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36 
Access-Control-Request-Headers: authorization 
Accept: */* 
DNT: 1 
Accept-Encoding: gzip, deflate 
Accept-Language: en-US,en;q=0.9 

応答:

HTTP/1.1 403 Forbidden 
Date: Fri, 22 Dec 2017 20:16:11 GMT 
Strict-Transport-Security: max-age=31536000; includeSubDomains 
X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Content-Security-Policy: upgrade-insecure-requests 
Referrer-Policy: origin-when-cross-origin 
Cache-Control: no-cache,must-revalidate,max-age=0,no-store,private 
Set-Cookie: BrowserId=IBrO4jKqQ6qedsWA5DFIcw;Path=/;Domain=.salesforce.com;Expires=Tue, 20-Feb-2018 20:16:11 GMT;Max-Age=5184000 
Expires: Thu, 01 Jan 1970 00:00:00 GMT 
Connection: close 
Content-Length: 19 

Missing_OAuth_Token 

ありがとうございます!

P.S:これは私がStackOverflowで投稿した最初の質問です。私はそれが基準を満たすことを願っています。それが前もって謝っていなければ、私は喜んで修正するでしょう。

+0

まず、あなたの質問は理にかなっているので、無謝罪必要!第二に、私は混乱しています - あなたがGET要求をするとき、おそらくAuthorizationヘッダーを渡しているでしょうか?したがって、プリフライトOPTIONSリクエストでも自動的に渡されるはずです...プリフライトOPTIONSリクエストのリクエストヘッダとレスポンスヘッダの両方の例はありますか?あなたのリクエストにwithCredentialsフラグを設定していると思いますか? – roryhewitt

+0

はい、私のGETリクエストにはAuthorizationヘッダーが含まれていますが、私の理解では、カスタムヘッダーなしで常にプリフライトリクエストが送信されます。将来の要求で。私はwithCredentialsフラグもこのような理由で飛行前の要求に影響を与えないと信じています。 – nonAlgebraic

+0

W3仕様では、ブラウザがプレフライトから余分なヒアラーを省略していることを確認しています。http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0 – nonAlgebraic

答えて

0

あなたはまだこのアプリケーションの開発に忙しいと思いますが、リクエストはlocalhostから来ていますか?

飛行前の実際の応答が何であるかを確認していて、Access-Control-Allow-Methodsに呼び出ししようとしているPUTまたはGETメソッドが含まれていれば、

正しく設定されている場合、SalesforceはCORSをサポートしています。

Salesforceセットアップでは、クロスオリジンリソース共有(CORS)の起点をホワイトリストに登録できます。その起源は、Webブラウザで実行されているコード(Salesforceと通信するためにJavaScriptなど)を実行できるようになります。ここでSalesforceのドキュメントで、このトピックの

読む:

https://developer.salesforce.com/docs/atlas.en-us.chatterapi.meta/chatterapi/extend_code_cors.htm

+0

はい、クライアントアプリケーションlocalhost上で実行されています。はい、ブラウザによってトリガされたOPTIONSのフライト前リクエストには、「Access-Control-Allow-Methods」および「Access-Control-Allow-Headers」ヘッダが含まれています。プレフライトへの応答は403 Forbiddenであり、有効なOAuthトークンがないことを告げるエラーメッセージ(つまり、「Authorization」ヘッダー - 開始GET要求の存在が飛行前にトリガーされたもの)。最後に、はい、私はSalesForceのCORS設定の原点をホワイトリストに載せました。 – nonAlgebraic

+0

私はそれを正確に行い、問題なく進めました。あなたはいくつかのサンプルコード@nonAlgebraic –

+0

を十分に公表する必要があります!いくつかのサンプルコードでOPを編集しました。ご注意いただきありがとうございます。 – nonAlgebraic

関連する問題