CORS 経由で別のサーバーと通信する MobileSafari にページをロードしています。
デスクトップ ブラウザー (テスト済みの Chrome と Safari) では、ログインしてセッション Cookie を取得し、その後の要求でそのセッション Cookie を送り返すことができるため、すべての API 呼び出しで認証を受けることができます。
ただし、Mobile Safari 経由でログインすると、後続のリクエストで Cookie が返されません。
私はCharles Proxyを使用して何が起こっているかをスパイしています.
POST https://myremoteserver.com/sessions.json
ログイン情報を渡す- 成功し、有効な
Set-Cookie
ヘッダーで応答が受信されます。 GET https://myremoteserver.com/checkout.json
Cookie
要求ヘッダーなしで要求されます。- ログインしていないかのようにサーバーが応答します。
このスニペットを使用して、XHR オブジェクトに適切に設定されているZepto.js
ことを確認します。withCredentials: true
(コーヒースクリプトを許してください)
# Add withCredentials:true to the xhr object to send the remote server our cookies.
xhrFactory = $.ajaxSettings.xhr
$.ajaxSettings.xhr = ->
xhr = xhrFactory.apply(this, arguments)
xhr.withCredentials = yes
xhr
そして、そのスニペットはデスクトップ ブラウザーでうまく機能します。追加する前は、それらのデスクトップ ブラウザーでセッション Cookie を保存できませんでした。
これがデスクトップブラウザのように動作するのを妨げる、MobileSafari の癖はありますか? 同じように機能しないのはなぜですか?
編集!
これが私のRails 2.3アプリでのCORSヘッダーのセットアップです。かなり標準的なものだと思います
def add_cors_headers
if valid_cors_domain
headers['Access-Control-Allow-Origin'] = request.headers['HTTP_ORIGIN']
headers['Access-Control-Expose-Headers'] = 'ETag'
headers['Access-Control-Allow-Methods'] = 'GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD'
headers['Access-Control-Allow-Headers'] = '*,x-requested-with,Content-Type,If-Modified-Since,If-None-Match'
headers['Access-Control-Allow-Credentials'] = 'true'
headers['Access-Control-Max-Age'] = '86400'
end
end
また、今日、Mountain Lion のデスクトップ Safari は Cookie を送信しなくなり、MobileSafari と同じように動作しました。昨日の私の評価が不正確だったのか、それとも Apple が私を荒らしているだけなのか、完全にはわかりません...
また、これhttps://
はリモート URL で使用することによって影響を受ける可能性がありますか?