如何在访问和离开页面后保持会话或cookie活着?

时间:2018-03-09 16:45:17

标签: php laravel session cookies

我正在尝试使用OAuth系统构建一个推荐系统,我正在使用Laravel框架。因此,当用户使用推荐链接访问注册页面时,它会创建一个cookie和一个会话。要注册所有提供的是社交按钮,所以每当用户点击谷歌或Facebook的注册表时。

用户返回网站后会话和cookie消失。这是为什么?以下是我认为可能有帮助的文件。

我在ref

的基础上创建了会话和cookie
if ($request->has('ref')){
            $referral = ReferralLink::whereCode($request->get('ref'))->first();
            $response->cookie('ref', $referral->user_id, $referral->program->lifetime_minutes);
            $_SESSION['ref'] = $referral->user_id;
            request()->session()->put('ref', $referral->user_id);
        }

我在ref

的基础上检索会话和cookie
   $session = request()->session()->get('ref');
        dd(request());
        $referral = \App\User\ReferralLink::where('user_id', $event->referralId)->orWhere('user_id', $session)->first();
        // dd($event->user, $event->referralId, $referral);
            if (!is_null($referral)){
                $provider = $referral->user;
                \App\User\ReferralRelationship::create([
                    'referral_link_id' => $referral->id, 
                    'user_id' => $event->user->id,
                    'referree_user_id' =>  $provider->id,
                    'reward'    => 'no',
                    ]);
        }

1 个答案:

答案 0 :(得分:1)

解决方案是使用OAuth2协议的state参数传递其他参数。然后,当用户点击任何“登录”,并且您收到OAuth2响应时,您将恢复状态。

这个想法将是:

  1. 会话已开启,用户拥有一些会话数据
  2. 我们对会话ID进行了编码,并将其发送到OAuth请求
  3. 当用户完成对自己进行身份验证时会话将丢失
  4. OAuth2响应到了,会话ID也是
  5. 会话ID从响应中提取,已解码,我们还原会话
  6. 首先,获取会话ID并对其进行编码:

    use Session;
    
    // ...
    
    $session_id = Session::getid();
    $session_id = base64_encode($session_id);
    

    我没有看到您的OAuth2请求,因此我们举一个虚拟示例来说明如何发送状态(=编码的会话ID):

    $request = "https://authorization-server.com/auth?response_type=code&
      client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=$session_id";
    

    (最好是使用至少http_build_query()或更好的GuzzleHttp)

    然后,用户通过身份验证,我们得到了回复:

    HTTP/1.1 200 OK
    Content-Type: application/json
    Cache-Control: no-store
    Pragma: no-cache
    
    {
      "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
      "token_type":"bearer",
      "expires_in":3600,
      "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
      "scope":"photos",
      "state":"aGVsbG8gd29ybGQ="
    }
    

    然后我们将解码它以取回我们的会话ID:

    $response = /* ... */
    
    $state = $response['state'];
    
    $session_id = base64_decode($state);
    

    最后,恢复你的会话:

    Session::setId($session_id);
    Session::start();