登录后,我使用会话来设置用户详细信息。如果我使用邮递员,我可以获得会议详细信息。如果我尝试从我的浏览器登录它显示为空
这是我的控制器
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)));
}
}
配置/ session.php文件
'driver' => 'file',
修改1 作为一个信息点,我使用laravel只进行api调用。所以我的域名将是api.mydomain.com/sessiondetails/activeuser
这是问题吗?
修改2
第一个对象是对会话获取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'));
}
答案 0 :(得分:2)
PHP会话使用cookie来跟踪会话。您访问页面mydomain.com并且浏览器发送该域的cookie,但是当javascript向api.mydomain.com发出请求时,它不包含cookie,因为它是跨域请求,因此会话可以&# 39;跟踪。
令牌身份验证是无状态的,这意味着没有要保存或检索的会话。请求所需的所有信息都必须包含在请求中。因此,您可以从令牌获取用户信息。
在您的登录页面上,您发布凭据并返回令牌。然后,您的前端会将令牌附加到每个后续请求。
此示例假定您使用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();
}
您应该在客户端存储该信息,而不是从服务器请求获取会话数据。
答案 1 :(得分:0)
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'] );
});