私はSalesForce API(a.k.a.A SalesForce "Connected App")を使用するAngularアプリを開発しています。 oAuth/OpenIDを介して認証が行われ、正常に動作します。しかし、アプリは現在ので、正常にSalesforceのAPIエンドポイントにアクセスすることはできません:それは、サーバレスのアプリだプロバイダが承認ヘッダーがないためにフライト前のリクエストを拒否したときにクライアントサイドCORSを機能させる
- とREST呼び出しは、クライアント側と
- REST呼び出しを作っている「非シンプル」です:カスタムヘッダー(oAuthアクセストークンを保持する「Authorization」ヘッダー)が含まれているため、ブラウザはプレフライトOPTIONS要求を発行します。 と
- 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で投稿した最初の質問です。私はそれが基準を満たすことを願っています。それが前もって謝っていなければ、私は喜んで修正するでしょう。
まず、あなたの質問は理にかなっているので、無謝罪必要!第二に、私は混乱しています - あなたがGET要求をするとき、おそらくAuthorizationヘッダーを渡しているでしょうか?したがって、プリフライトOPTIONSリクエストでも自動的に渡されるはずです...プリフライトOPTIONSリクエストのリクエストヘッダとレスポンスヘッダの両方の例はありますか?あなたのリクエストにwithCredentialsフラグを設定していると思いますか? – roryhewitt
はい、私のGETリクエストにはAuthorizationヘッダーが含まれていますが、私の理解では、カスタムヘッダーなしで常にプリフライトリクエストが送信されます。将来の要求で。私はwithCredentialsフラグもこのような理由で飛行前の要求に影響を与えないと信じています。 – nonAlgebraic
W3仕様では、ブラウザがプレフライトから余分なヒアラーを省略していることを確認しています。http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0 – nonAlgebraic