17

www.example.comにWebアプリがあり、api.example.comにAPIがあります。

WebアプリケーションはAPIに対してajax呼び出しを行います。

セッションを追跡するために、どこかにapi.example.comにCookieを配置する必要があります。

問題を追跡するために、WebアプリケーションとAPIの両方のサブドメインにテストCookieを設定しました。Webアプリは.exemple.comにCookieを設定し、APIは.exemple.comにCookieを設定し、API.exemple.comにもう1つCookieを設定します。Cookieは、Domain=.exemple.comのみを使用して設定されます。パスもHTTPOnlyもありません。

注:最終的には、api.exemple.comに1つだけ必要です。しかし、これらはテスト用です。

ブラウザ(Firefox 16)を使用した直接クエリは正常に機能します。APIでのクエリ:2つのCookieが設定されて送信されます。wwwでクエリ:Cookieが設定され、APIからの2つも送信されます。(もちろん、APIの後にwwwを照会する場合)。

今、私はブラウザのクッキーをきれいにし、wwwだけをクエリします。wwwでのクエリ:以前と同じように正常に動作します。wwwのajaxリクエストからのAPIのサブクエリ:Cookieは送信されません。Set-Cookiesは何もしません。Firebugを使用すると、応答にCookieが表示されます。しかし、その後のリクエストやページ情報でそれらの痕跡はありません。

FirefoxでCookieログを有効にしようとしました。APIからのCookieの痕跡はまったくなく、拒否通知もありません。

結局、APIに1つのCookieを保存する方法だけが必要です。そしてそのために、私はかなり開いています:)

情報:2つのサーバーはNodeJSです。サーバー側(Set-Cookieヘッダー)、クライアント側(document.cookies)で、firebugを使用して手動でCookieを設定しようとしました。

私が解決策なしでチェックした他の投稿(そして私が覚えていない他の多くの投稿):

javascriptを使用したクロスサブドメインCookieの設定

クッキーとサブドメイン

subdomain.example.comはexample.comが読み取ることができるCookieを設定できますか?

4

3 に答える 3

47

APIでallowCredentialsヘッダーを設定します

Access-Control-Allow-Credentials: true

withCredentialsリクエストに使用

$.ajax({
    url: a_cross_domain_url,
    xhrFields: { 
        withCredentials: true 
    }
});

そうしないと、ヘッダーに関係なく、はCookieを送信しXMLHttpRequestません。Access-Control-Allow-Credentials

上のワイルドカードを削除しますAccess-Control-Allow-Origin

Access-Control-Allow-Origin: http://www.example.com

ワイルドカード*は機能しません。が設定されている場合、ブラウザは応答を破棄しwithCredentialsます。

参照:

http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

https://developer.mozilla.org/en-US/docs/HTTP_access_control

http://arunranga.com/examples/access-control/credentialedRequest.html

http://api.jquery.com/jQuery.ajax/

于 2012-10-22T06:57:51.963 に答える
1

アレクサンドルの正解に加えて、これは.htaccessを介した私の作業CORS設定です。

phps(またはそれ以上)のあるディレクトリのapi.example.comの.htaccessファイルに追加:

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://www.example.com"
    Header set Access-Control-Allow-Headers "Origin, Content-Type, X-Auth-Token"
    Header set Access-Control-Allow-Credentials "true"
</IfModule>

そして、www.example.comで、AJAX呼び出しxhrFields:{withCredentials:true}を追加しました。すべての設定は次のとおりです。

jQuery.ajax({
    url: myURL,
    type: "POST",
    xhrFields: {withCredentials: true},
    dataType: "text",
    contentType: "text/xml; charset=\"utf-8\"",
    cache: false,
    headers: "",
    data: myCallJSONStr,
    success: function(myResponse) { etc....

URLがapi.example.comのphpを呼び出す場所。

アレクサンドルは正しいことに注意してください。正確なサブドメインを指定する必要があります。残念ながら、ワイルドカードは機能しません。したがって、これは機能しません。

Header set Access-Control-Allow-Origin "*"

Access-Control-Allow-Credentialsの「true」設定を使用すると、この設定はCORSによってブロックされます。

于 2021-02-11T04:35:14.907 に答える
1

AJAXとPHPを使用して複数のサブドメインから単一のAPIドメインにCookieを渡す必要があるときに以前のソリューションで問題が発生したため、後でこの投稿を追加しました

これが課題と解決策でした。

1-api.example.comのバックエンドPHP。

2-one.example.com、two.example.comなどの複数のJSフロントエンド。

3-Cookieは双方向で渡される必要がありました。

4-api.example.comの複数のフロントエンドからPHPバックエンドへのAJAX呼び出し

5-PHPでは、$ _ SERVER ["HTTP_ORIGIN"]を使用することを好みません。私の意見では、常に信頼できる/安全であるとは限りません(HTTP-ORIGINが常に空であるブラウザがいくつかありました)。

単一のフロントエンドドメインを使用してPHPでこれを行う通常の方法は、次のコマンドでPHPコードを開始することです。

header('Access-Control-Allow-Origin: https://one.example.com');  
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');  
header('Access-Control-Allow-Credentials: true');  

そして、one.example.comドメインのJSでは:

jQuery.ajax({
    url: myURL,
    type: "POST",
    xhrFields: {withCredentials: true},
    dataType: "text",
    contentType: "text/xml; charset=\"utf-8\"",
    cache: false,
    headers: "",
    data: myCallJSONStr,
    success: function(myResponse) {.....}

ただし、APIドメインを呼び出すために複数のサブドメインを使用しているため、これは機能しません。

そして、私がクッキーを渡したいので、この解決策は機能しません:

header('Access-Control-Allow-Origin: *');  

これは、JSサイトのCookieの受け渡し設定と競合します。

xhrFields: {withCredentials: true}

これが私がしたことです:

1-GETパラメーターを使用してサブドメインを渡します。

2-PHPでメインドメインをハードコーディングして、(すべての)サブドメインのみが許可されるようにします。

これは私のソリューションのJS/JQueryAJAX部分です。

関数getSubDomain(){

let mySubDomain = "";

let myDomain = window.location.host;
let myArrayParts = myDomain.split(".");
if (myArrayParts.length == 3){
    mySubDomain = myArrayParts[0];
}

return mySubDomain;

}

そしてAJAX呼び出しでは:

let mySubDomain = getSubDomain();
if (mySubDomain != ""){
    myURL += "?source=" + mySubDomain + "&end"; //use & instead of ? if URL already has GET parameters
}

jQuery.ajax({
    url: myURL,
    type: "POST",
    xhrFields: {withCredentials: true},
    dataType: "text",
    contentType: "text/xml; charset=\"utf-8\"",
    cache: false,
    headers: "",
    data: myCallJSONStr,
    success: function(myResponse) {.....}

最後に、PHPの部分:

<?php

$myDomain = "example.com";
$mySubdomain = "";

if (isset($_GET["source"])) {
    $mySubdomain = $_GET["source"].".";
}

$myDomainAllowOrigin = "https://".$mySubdomain.$myDomain;
$myAllowOrigin = "Access-Control-Allow-Origin: ".$myDomainAllowOrigin;

//echo $myAllowOrigin;

header($myAllowOrigin);  
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');  
header('Access-Control-Allow-Credentials: true');

重要、すべてのサブドメインにCookieを設定することを忘れないでください。この場合、Cookieのドメインは次のようになります。.example.com(メインドメインの前にドットが付いている):

<?php

    //////////////// GLOBALS /////////////////////////////////
    
    $gCookieDomain = ".example.com";
    $gCookieValidForDays = 90;
    
    //////////////// COOKIE FUNTIONS /////////////////////////////////
    
    function setAPCookie($myCookieName, $myCookieValue, $myHttponly){
        global $gCookieDomain;
        global $gCookieValidForDays;
        
        $myExpires = time()+60*60*24*$gCookieValidForDays;
        setcookie($myCookieName, $myCookieValue, $myExpires, "/", $gCookieDomain, true, $myHttponly);   
        
        return $myExpires;
    }

このソリューションにより、example.comの任意のサブドメインからapi.example.comのAPIを呼び出すことができます。

NB。呼び出し元のサブドメインが1つしかない状況では、PHPの代わりに.htaccessを使用してCORSを設定することをお勧めします。api.example.comを呼び出すone.example.comのみの.htaccess(linux / apache)の例を次に示します。

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "https://one.example.com"
    Header set Access-Control-Allow-Headers "Origin, Content-Type, X-Auth-Token"
    Header set Access-Control-Allow-Credentials "true"
</IfModule>

そして、この.htaccessをapi.example.comのルートに配置します。

于 2021-02-12T00:11:42.100 に答える