登录后,我使用会话来设置用户详细信息。如果我使用postman,我可以获得会话的详细信息。如果我尝试从我的浏览器登录,它显示为空
这是我的控制器
namespace App\Http\Controllers;
use App\Models\User;
use Session;
class UserController extends Controller {
public function login(){
$postdata = file_get_contents("php://input");
$request = json_decode($postdata);
$requestArray = array();
foreach($request as $key => $value){
$requestArray[$key] = $value;
}
$user = User::login($requestArray);
Session::put("activeuser", $user);
Session::save();
return json_encode(array('result'=>Session::get("activeuser")));
}
获取会话详细信息的控制器
namespace App\Http\Controllers;
use Session;
class ThisSessionController extends Controller {
public function getdetails($key)
{
return json_encode(array($key => Session::get($key)));
}
}
config/session.php
'driver' => 'file',
编辑1作为参考,我使用laravel只进行api调用。因此,我的域将是api.mydomain.com/sessiondetails/activeuser
这就是问题所在吗?
编辑2
第一个对象是对会话get url的ajax调用,第二个对象是登录成功后的返回值。
两个令牌完全不同。
编辑-3
我已经用jwt更新了laravel,但它抛出的JWT::Factory不可用。下面是我的更新代码。
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Requests;
use JWTAuth;
use Tymon\JWTAuth\JWTManager as JWT;
use Tymon\JWTAuth\Exceptions\JWTException;
class UserController extends Controller {
public function login(Request $request){
$credentials = $request->only('username', 'password');
$user = User::login($requestArray);
if($user){
$payload = JWTFactory::make($credentials);
$token = JWTAuth::encode($payload);
}
return json_encode(array('result'=>$token));
}
编辑-4
我更改了登录函数中的代码,得到的结果为
{"token":{}}
UserController@登录代码
$customClaims = ['foo' => 'bar', 'baz' => 'bob'];
$payload = app('tymon.jwt.payload.factory')->make($customClaims);
$token = JWTAuth::encode($payload);
编辑5
我可以用laravel生成令牌的最后一个工作代码是
public function login(Request $request){
$credentials = $request->only('username', 'password');
try {
$user = User::login($credentials);
if(!$user)
throw new Exception("Error Processing Request", 1);
} catch (Exception $e) {
return response()->json(['error' => false]);
}
$token = JWTAuth::fromUser($user);
return response()->json(compact('token'));
}
发布于 2015-12-28 13:59:21
PHP会话使用cookie来跟踪会话。您访问页面mydomain.com,浏览器发送该域的cookies,但是当javascript向api.mydomain.com发出请求时,它不包括cookies,因为它是跨域请求,所以会话无法被跟踪。
令牌身份验证是无状态的,这意味着没有会话可保存或从中检索。请求中必须包含请求所需的所有信息。因此,您可以从令牌中获取用户信息。
在登录页面上,您可以发布凭据并返回令牌。然后,您的前端会将令牌附加到每个后续请求。
此示例假定您使用JWTAuth,但是这个概念适用于任何令牌服务。
public function login(Request $request){
// This is all unnecessary. You're in Laravel, take advantage of the services Laravel provides. Use [Request](https://laravel.com/docs/5.1/requests#retrieving-input) instead.
//$postdata = file_get_contents("php://input");
//$request = json_decode($postdata);
//$requestArray = array();
//foreach($request as $key => $value){
// $requestArray[$key] = $value;
//}
// change email to username depending on what you use to authenticate
$credentials = $request->only('username', 'password');
$user = User::login($requestArray);
if($user){
$token = JWTAuth::fromUser(User::where('username', $credentials['username'])->first());
} else {
return response()->json(array('error' => 'invalid credentials')))
// all good so return the token
return response()->json(compact('token'));
}
一旦有了令牌,就可以使用JWT中间件jwt.auth来保护任何路线。要从令牌中获取用户信息,请使用JWTAuth::toUser()
public function getCurrentUser()
{
return JWTAuth::toUser()->toJson();
}
您应该将该信息存储在客户端,而不是请求从服务器获取会话数据。
发布于 2021-02-27 16:48:55
首先_您必须在web路由中登录用户,而不是api。第二_如果您的会话在普通请求中工作,而不是在您的应用程序中工作,您可以使用cors中间件来发送跨平台请求,如下所示
Route::group(['middleware' => ['cors']], function()
{
Route::post('/auth/register',[UserApiController::class, 'register'] );
Route::post('/auth/login',[UserApiController::class, 'login'] );
Route::post('/auth/verify',[UserApiController::class, 'verify'] );
});
在laravel中,默认情况下不能使用cors中间件,但可以从此处安装npm包https://github.com/fruitcake/laravel-cors
https://stackoverflow.com/questions/34487807
复制相似问题