我正在将Laravel集成到旧版php应用程序中。登录页面曾经直接发布到verifyUser.php
,这也启动了Symfony会话。
新架构现在发布到了laravel api,该laravel api在verifyUser.php
上发布了Guzzle。
javascript:
$(document).ready(function(){
$('#signIn').submit(function(){
var a = $('#email').val();
$.post('/api/login', { //this used to post to verifyUser.php
Username: $('#email').val(),
Password: $('#password').val()
}, function(data){
if(data['credentials'] == true){
console.log('credentials true');
console.log(data['uri']);
window.location.href=data['uri'];
} else {
$('#errMsg').html(data['errMsg']);
$('.alert').show();
}
}, 'json');
return false;
});
控制器功能:
public function authenticate(Request $request) //aka api/login endpoint
{
//...
$legacyRes = $this->authenticateLegacy($request);
//...
}
private function authenticateLegacy(Request $request)
{
$response = null;
try {
$response = $this->client->post('/admin/verifyUser.php', [
'form_params' => ['Username' => $request->get('Username'),
'Password' => $request->get('Password')]
]);
}
catch(Exception $exception){
Log::error('Errrererererer', [$exception->getMessage()]);
}
$body = (string)$response->getBody();
Log::info('BODY:', [$body]);
return $body;
}
我已经删除了verifyUser.php,因为我已经对其进行了测试,并且它返回了预期的结果。
使用浏览器时,似乎未设置会话信息。但是根据我的帖子回复,一切都应该正常进行。 这是因为我正在通过枪口路由请求吗?
答案 0 :(得分:1)
我假设您的旧式端点使用cookie来标识用户的会话。
对旧式端点的成功请求返回一个Set-Cookie
头。
Guzzle不会将此API响应中的Set-Cookie
头转发到浏览器-您必须将此行为编程到“包装”应用程序中。
在发送其他任何请求时,您将需要让guzzle显式地将相应的Cookie
头传递给旧式api(以维持用户的登录状态)。
要实现此目的,您需要将此Cookie保存在新应用程序中(即,在用户的会话中或数据库中),然后将其传递到Cookie
标头中以及您对旧版API。
答案 1 :(得分:1)
在我的回答下发布以显示更新的代码:
private function authenticateLegacy(Request $request)
{
//...
//parse cookie id from guzzle response
$body = (string)$response->getBody();
$cookie = $response->getHeader('Set-Cookie'); //PHPSESSID=SOMEID; path=/
$cookieBite = explode(';', $cookie)[0]; ////PHPSESSID=SOMEID
$cookieId = explode('=', $cookieBite)[1];
$data = json_decode($body, true);
$data['session'] = $cookieId;
return $data;
}
动作中:
public function authenticate(Request $request)
{
//...
$legacyRes = $this->authenticateLegacy($request);
//...
// this will have the session id in the body but will also
// set the cookie for the client so I don't have
// to set document.cookie w/ js
return response($legacyRes, 200)
->withCookie('PHPSESSID', $legacyRes['session']);
}