我正在对旧的CodeIgniter应用程序进行现代化改造。通过在前端和后端分离应用程序。
新的前端是一个有角度的SPA应用程序。后端仍然使用of CI应用程序。CI使用Ion_Auth对用户进行授权。
如果两者都在同一个域中,则一切都正常,例如localhost
问题是,每个部分都必须在不同的url域上,即:
- 前端-本地主机:8081,将来会是example.com
- 后端-localhost:8082,将来将是api.example.com
Ion Auth可以通过这种方式登录用户,但当我查询用户是否已登录时,它会返回false
。CI不再主持会话。
我还注意到,当两者都在同一域中时,session
文件夹只包含一个文件,这意味着CI可以识别会话。
当我将其设置到不同的域时,session
文件夹会为每个XHR请求创建一个新文件。这意味着CI不再举行会议。
为什么会发生这种情况?我应该怎么做才能使前端和后端正确使用Ion Auth?
以下是我的CI配置:
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = BASEPATH . 'var/session/';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
$config['csrf_protection'] = FALSE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();
我还设置了:
header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
这就是我提出XHR请求的方式。
$http({
url: $rootScope.API_URL + "/user/check",
method: "POST",
headers: { "Content-Type": undefined },
data: { /*...*/ }
}).then( /*...*/ )
我刚刚在https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#section_5
CCD_ 5或Fetch和CORS所揭示的最有趣的能力是使";认证的";知道HTTP cookie和HTTP身份验证信息的请求。默认情况下,在跨站点
XMLHttpRequest
"中;或者Fetch调用,浏览器将不发送凭据。必须在CCD_ 7〃上设置一个特定标志;对象或CCD_ 8构造函数。
(特别突出显示句子中的NOT关键字(。
我换句话说。无论如何,它都不会起作用。XHR请求中必须有一个特殊标志。使用AngularJS$hhtp
对象时,我必须使用withCredentials: true
$http({
url: ...
withCredentials: true
})
还需要在API响应中设置两个头:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://localhost
不幸的是,我无法将*
用作Access-Control-Allow-Origin
,而是必须使用正确的域。
当请求的凭据模式为"include"时,响应中的"Access-Control-Allow-Origin"标头不得为通配符"*"。
通过这种方式,我可以通过保留cookie的会话发出跨源XHR请求。