facebook php登录FBRLH_state会话变量值从facebook返回后发生更改


facebook php login FBRLH_state session variable value changed after coming back from facebook

我正试图在我的web应用程序中使用php-sdk实现facebook登录,但它不起作用。出于某种原因,在用户从facebook页面返回以获得应用程序访问用户信息的权限后,$_SESSION["FBRLH_state"]的值似乎已被修改。

以下是我正在使用的代码:

facebookloginbutton.php

<?php
session_start();    
require_once 'facebook/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';
$fb = new Facebook'Facebook([
  'app_id' => '*****',
  'app_secret' => '*****',
  'default_graph_version' => 'v2.5',
]);
$helper=$fb->getRedirectLoginHelper();
$permissions=['public_profile']; // Optional permissions
$loginUrl=$helper->getLoginUrl('mydomain.com/snslogin/fb-callback', $permissions);
//output the FBRLH_state here (name this state1)
echo $_SESSION["FBRLH_state"];
?>
<a href="<?php echo htmlspecialchars($loginUrl); ?>">facebook login</a>

fb-callback.php(仅顶部)

<?php
session_start();    
require_once 'facebook/facebook-php-sdk-v4-5.0.0/src/Facebook/autoload.php';
//output $_SESSION["FBRLH_state"] (name this state2)
var_dump($_SESSION);
//output the state variable in the URL (name this state3)
echo '<br>'.$_GET["state"].'<br>';

在上面的代码中,我得到了状态1和状态3的相同值,但由于某些原因,状态2不同。由于这些值不同,程序不会继续执行fb-callback.php的其余代码。

我在另一个网络应用程序中用facebook帐户进行了php登录,所以我以为我知道自己在做什么,但我就是找不到我犯的错误。

我认为这些设置不允许跨站点会话共享之类的。

public function index()
{
    $fbConfig = config('Facebook');
    
    $fb = new FacebookLogin([
        'app_id' => $fbConfig->appID,
        'app_secret' => $fbConfig->appSecret,
    ]);
    
    $helper = $fb->getRedirectLoginHelper();
    
    $permissions = ['email', 'public_profile', 'user_friends'];
    if(!$this->session->has('fb_access_token'))
    {               
        $accessToken = $helper->getAccessToken();
        
        if($accessToken)
        {               
            $this->session->set('fb_access_token', $accessToken);
        }
    }
    else
    {
        $accessToken = $this->session->get('fb_access_token');
    }
    
    $loginUrl = $helper->getLoginUrl(base_url(route_to('facebook/callback')), $permissions);
    
    return redirect()->to($loginUrl);
}
public function callback()
{
    $usersModel = new UsersModel();     
        
    $fbConfig = config('Facebook');
    
    $fb = new FacebookLogin([
        'app_id' => $fbConfig->appID,
        'app_secret' => $fbConfig->appSecret,
    ]);
    
    $getResponse = $this->request->getGet(NULL);
    
    if(isset($getResponse['state']))
    {
        $this->ViewData['Metas'] = $this->getMetas($this->metaSeo['success']);
    
        $helper = $fb->getRedirectLoginHelper();
        
        if(!$this->session->has('fb_access_token'))
        {               
            $accessToken = $helper->getAccessToken();
            
            $this->session->set('fb_access_token', $accessToken);
        }
        else
        {
            $accessToken = $this->session->get('fb_access_token');
        }
        
        $response = $fb->get('/me?fields=id,name,email,location', $accessToken);
        
        $user = $response->getGraphUser();
        
        if($user->getEmail())
        {
            $UserFound = $usersModel->where('email', $user->getEmail())->first();
        
            if($UserFound)
            {   
                $this->session->set('user', $UserFound->id_user);
                
                $UserFound->setLastLogin();
                
                $usersModel->save($UserFound);
                
                return redirect()->to('account');
            }
        }
        else
        {
            // email is required to acceess account
        }
        
        $this->ViewData['LayoutView'] = 'Facebook/Success';
    }
    else
    {
        $this->ViewData['LayoutView'] = 'Facebook/Errors';
        
        if($getResponse['error_reason'] == 'user_denied')
        {
            
        }
    }
    return view('MasterPages/Master', $this->ViewData);
}