首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在访问和离开页面后保持会话或cookie的存活?

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

Stack Overflow用户
提问于 2018-03-09 16:45:16
回答 1查看 738关注 0票数 0

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

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

在这里,我创建了基于引用的会话和cookie。

代码语言:javascript
复制
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);
        }

在其中,我根据参考文献检索会话和cookie。

代码语言:javascript
复制
   $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',
                    ]);
        }
EN

回答 1

Stack Overflow用户

发布于 2018-03-09 17:08:05

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

这样做的目的是:

  1. 会话是打开的,用户有一些会话数据。
  2. 我们对会话id进行了编码,并将其发送到OAuth请求中。
  3. 当用户完成对他/她的身份验证时,会话将丢失。
  4. OAuth2响应到达,会话id也到达
  5. 会话id从响应中提取,解码,然后恢复会话。

首先,获取会话id并对其进行编码:

代码语言:javascript
复制
use Session;

// ...

$session_id = Session::getid();
$session_id = base64_encode($session_id);

我没有看到您的OAuth2请求,所以我们以一个虚拟示例来演示如何传送状态(=编码的会话id):

代码语言:javascript
复制
$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)

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
$response = /* ... */

$state = $response['state'];

$session_id = base64_decode($state);

最后,恢复会话:

代码语言:javascript
复制
Session::setId($session_id);
Session::start();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49198386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档