如果从浏览器

时间:2015-12-28 04:46:51

标签: php session laravel-5

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

这是我的控制器

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

enter image description here

第一个对象是对会话获取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'));  

  }

2 个答案:

答案 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)

首先_你必须在web路由而不是api中登录用户

second _ 如果您的会话在正常请求中工作但不在您的应用中工作,您可以使用 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'] );

});