我已经构建了一个非常简单的 CakePHP 应用程序来测试 Facebook PHP SDK 的可能实现,用户可以使用该应用程序或 Facebook 进行注册,也可以使用该应用程序或 Facebook 登录。但是因为用户可以在应用程序上做事,所以即使他们通过 Facebook 帐户登录/注册,他们也会在应用程序上拥有一个用户帐户。
到目前为止,我已经创建了两种处理身份验证和获取用户信息的方法:
// Asks user to authenticate
public function facebook()
{
$params = array(
'redirect_uri' => 'http://domain.com/users/signupfacebook',
'scope'=> 'email',
'display' => 'popup'
);
$loginUrl = $this->Facebook->Sdk->getLoginUrl($params);
// Need to know if user is already a user on OUR app
// If true log them in. If false redirect to signup form like below
$this->autoRender = false;
$this->response->header('Location', $loginUrl);
}
// Handle the return
public function signupfacebook()
{
$user = $this->Facebook->Sdk->getUser();
if($user)
{
try
{
$facebookuser = $this->Facebook->Sdk->api('/me');
$this->set('facebookuser', $facebookuser);
}
catch(FacebookApiException $e)
{
error_log($e);
$user = NULL;
}
}
else
{
$this->Session->setFlash('An error has occurred! Please try again.');
$this->redirect(array('action'=>'index'));
}
}
因此,一个用户说我想使用 Facebook 进行身份验证,这使用了我的控制器的 facebook() 方法,然后它会询问他们的许可并根据此操作重定向他们。目前它只会将他们发送到一个注册页面,其中一些字段是根据他们传递的用户信息预先填写的,如下所示:
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('User.email', array('type' => 'text', 'default'=> $facebookuser['email'], 'label' => array('class' => 'placeholder', 'text' => 'Email address') )); ?>
<?php echo $this->Form->input('User.firstname', array('type' => 'text', 'default'=> $facebookuser['first_name'], 'label' => array('class' => 'placeholder', 'text' => 'Firstname') )); ?>
<?php echo $this->Form->input('User.lastname', array('type' => 'text', 'default'=> $facebookuser['last_name'], 'label' => array('class' => 'placeholder', 'text' => 'Lastname') )); ?>
<?php echo $this->Form->input('User.username', array('type' => 'text', 'default'=> $facebookuser['username'], 'label' => array('class' => 'placeholder', 'text' => 'Username') )); ?>
<?php echo $this->Form->input('User.password', array('value' => '','type' => 'password', 'label' => array('class' => 'placeholder', 'text' => 'Password') )); ?>
<button type="submit">Create</button>
<?php echo $this->Form->end(); ?>
但我这里有几个问题:
问题 1.)如果用户已经在系统中拥有一个带有他们刚刚输入的 Facebook 凭据的帐户,那么它需要处理这个问题并让用户登录。这是否需要使用 Facebook 端的任何特殊功能?因为我只想在用户表中搜索匹配的帐户,然后自动登录,但我没有在网上找到任何在 FB 身份验证发生后验证您自己的用户表的示例。
问题 2.)可能与上一个问题有关,但是当用户注册帐户时,不会保存与他们用于登录的 Facebook 帐户的关联,因此如果当他们尝试使用 Facebook 再次登录时,将不会看到关联,除非我在数据库中搜索类似的详细信息,但这似乎很不稳定,而且 API 的使用不正确。本质上,用户只是使用 FB 来填充表单,而实际上并未使用他们的 Facebook 帐户进行实际注册。
我可以检查数据库中是否存在与通过 Facebook 传递的电子邮件地址相同的电子邮件地址,但如果他们从那以后更改了它怎么办?我考虑过可能将 Facebook 用户 ID 存储在应用程序中的用户 ID 表中,以便存储连接。这会是一个解决方案吗?或者错误的方法来做到这一点?
例如一个新表来存储 FB 用户和 CakePHP 应用程序用户之间的链接:
id
user_id (this is the relationship to your USER table)
facebook_user_id
但即使这样做,我也不确定如何利用它以有用的方式正确链接帐户并正确处理通过 Facebook 的身份验证,而不是仅在某些详细信息匹配时自动填充表单或登录用户(我确信这有潜在的安全风险)。
问题 3.)当用户通过 Facebook 发送回注册表单时,他们会收到以下 URL(出于安全原因,注意位已更改):
http://domain.com/users/signupfacebook?state=dbf2f6dds322b7cb90d71b6c958a001bf4a3ba&code=AQa7-GDsesM0ZfgswjgGF-mMKwjcoboLl19WKprIA2-f4iZzUdsd8o8z-NweYYODzySS3h9GksBw0G9WCXj79Pp-0ldyeIRCOLSt9gfgfsmEFEfOrEO6gm7a0jmDuQvchdsaHaw1QpI8RdGTCrqAPlLzpHGcqiCtBvXjiQtBhQP--tMr8CIlvRwbrJRwiZwF6xo30howlRkVTLddsdDCDt60_KGznPVmEe-T4Qbu9gdkv9v#_=_
据我所知:https ://developers.facebook.com/docs/howtos/login/server-side-login/我应该在上面发布的两种方法之间创建一个额外的步骤来处理代码并获得一个访问令牌回来。
但是我已经访问了填写注册表单所需的所有信息,而无需执行 OAuth 流程的第二阶段并获得访问令牌!所以不确定在这种情况下我是否需要它......或者我需要它吗?如果是这样,它将如何帮助解决前两个问题?