【问题标题】:Laravel 5 Session working in Postman not working if called from browser如果从浏览器调用,在 Postman 中工作的 Laravel 5 会话不起作用
【发布时间】:2016-04-01 23:10:24
【问题描述】:

登录后,我使用会话设置用户详细信息。如果我使用邮递员,我可以获得会话详细信息。如果我尝试从浏览器登录,则显示为 null

这是我的控制器

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

第一个对象是ajax调用session获取url,第二个对象是登录成功后的返回值。

两个令牌完全不同。

编辑 - 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'));  

  }

【问题讨论】:

  • 如果我在同一页面中使用 Session::get 它会返回。如果我拨打另一个网址,我不明白
  • 你检查 csrf_token 了吗?
  • 两者不同。我会发照片
  • 在您看到 Array[1] 的第二个对象中,试试这个 print_r(your_session_obj, true)。
  • 它是一个 api 调用。它来自我设置会话的同一页面,userController@login .....数据正在填充。在研究中,我发现,每次我进行 api 调用时都会生成一个新会话。如何克服这一点。

标签: php session laravel-5


【解决方案1】:

PHP 会话使用 cookie 来跟踪会话。您访问页面 mydomain.com 并且浏览器发送该域的 cookie,但是当 javascript 向 api.mydomain.com 发出请求时,它不包含 cookie,因为它是跨域请求,因此无法跟踪会话。

令牌身份验证是无状态的,这意味着没有要保存或检索的会话。请求所需的所有信息都必须包含在请求中。因此,您从令牌中获取用户信息。

在您的登录页面上,您发布凭据并返回一个令牌。然后,您的前端会将令牌附加到每个后续请求。

此示例假设您使用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();
}

您应该将这些信息存储在客户端,而不是发出请求以从服务器获取会话数据。

【讨论】:

  • 没错,会话存储在服务器上。您只需将用户凭据发送到 API,验证用户是否有效,然后返回用户信息。
  • 我遇到了问题。我不使用 jwtauth。但我可以将令牌带到我的 angularjs 应用程序中。现在我如何根据该令牌检索数据。
  • @AlaksandarJesusGene 这取决于你如何制作令牌。查看您使用的软件包的文档,了解如何从令牌中获取信息。
  • @AlaksandarJesusGene 因为当您使用邮递员直接向 api.mydomain.com 发出请求时,它将包含 cookie 并且会话将起作用。当您使用 ajax 跨域请求 api 时,cookie 不会发送并中断会话。
  • @jfadich,你能帮我几分钟了解它是如何完成的。我安装了 jwt,但不知道我应该在哪里编写代码并使用 angularjs 获取它。我知道堆栈溢出中有一个聊天室。不知道如何激活它。 chat.stackoverflow.com/rooms/99099/….
【解决方案2】:

首先 _ 你必须在 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'] );

});

【讨论】:

    猜你喜欢
    • 2015-06-03
    • 2015-09-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多