Php 如何在访问和离开页面后使会话或cookie保持活动状态?

Php 如何在访问和离开页面后使会话或cookie保持活动状态?,php,laravel,session,cookies,Php,Laravel,Session,Cookies,我正在尝试使用OAuth系统构建一个推荐系统,我正在使用Laravel框架。因此,当用户访问带有转介链接的注册页面时,它会创建一个cookie和一个会话。因为注册所提供的只是社交按钮,所以每当用户点击谷歌或Facebook注册时 一旦用户返回站点,会话和cookie就会消失。为什么呢?以下是我认为可能有用的文件 在这里,我基于ref创建了会话和cookie if ($request->has('ref')){ $referral = ReferralLink::wh

我正在尝试使用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);
        }
   $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',
                    ]);
        }
在这里,我根据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);
        }
   $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',
                    ]);
        }

解决方案是使用OAuth2协议的
state
参数传递附加参数。然后,当用户单击任何“loggin”时,您收到OAuth2响应,您将返回您的状态

其想法是:

  • 会话已打开,用户有一些会话数据
  • 我们对会话id进行了编码,并根据OAuth请求发送它
  • 当用户完成身份验证时,会话将丢失
  • OAuth2响应到达,会话id也到达
  • 会话id从响应中提取、解码,然后恢复会话
  • 首先,获取会话id并对其进行编码:

    use Session;
    
    // ...
    
    $session_id = Session::getid();
    $session_id = base64_encode($session_id);
    
    我没有看到您的OAuth2请求,因此我们使用一个虚拟示例来演示如何发送状态(=编码的会话id):

    (最好至少使用
    http\u build\u query()
    或更好的http)

    然后,对用户进行身份验证,我们将得到回复:

    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:

    $request = "https://authorization-server.com/auth?response_type=code&
      client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=$session_id";
    
    $response = /* ... */
    
    $state = $response['state'];
    
    $session_id = base64_decode($state);
    
    最后,恢复会话:

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

    删除
    $\u会话['ref']=$refloration->user\u id行,可能是某种干扰加上它是不必要的。我知道,但它不起作用35; session:Store{#272▼     #id:“4XpHZOZ07lklnyEaqqRVQdjezw0j4hoM16NBd9fm”#名称:“laravel#U会话”#属性:数组:3[▼       “_token”=>“tw9LDK72RasBuEvkyp1fhI9BuYmcRFi6fGnu51lO”“_previous”=>数组:1[▶]       “_flash”=>阵列:2[▶]     ]     #处理程序:FileSessionHandler{#273▶}     #开始:true}我在理解如何将会话状态输入到请求中时遇到问题。我对Oauth的请求仅为127.0.0.1:8000/login/google,我只是使用laravel Socialist,因此我不知道如何访问Oauth请求Hello@Anwar nairi Please answerHi@AdajOEL抱歉,我从未使用过laravel Socialist,但您可能会发现这很有帮助:。如果需要,请告诉我这有帮助。