我建立了一個非常簡單的CakePHP的應用程序來測試出一個可能的實現Facebook的PHP SDK的,使用戶可以註冊或者使用的應用或Facebook,也可以登錄使用應用程序或Facebook。但是因爲用戶可以在應用上做些事情,即使他們通過他們的Facebook帳戶登錄/註冊,他們也會在應用上擁有用戶帳戶。登錄Facebook的用戶進入CakePHP的應用程序,如果認證和用戶存在於數據庫
到目前爲止,我已經創建了處理身份驗證和獲取用戶信息的方法有兩種:
// 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傳遞的一個,但在DB中相同的電子郵件地址存在,因爲如果他們改變了什麼呢?我想過或許將Facebook用戶標識存儲在應用中的用戶標識表中,以便存儲連接。這是一個解決方案嗎?或者錯誤的方式來做到這一點?
例如新表來存儲用戶FB和CakePHP App用戶之間的聯繫:
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進程的第二階段並獲取訪問令牌!所以不知道我是否需要這種情況...或者我呢?如果是的話,它將如何協助解決前兩個問題?
你寫道:'用戶可以使用應用程序或Facebook註冊,也可以使用應用程序或Facebook登錄。我看不出你的意思。你能糾正它嗎?順便說一句,你能否清楚地說出你是否也計劃讓用戶在沒有Facebook的情況下連接?這意味着你會讓用戶創建賬戶和管理密碼。 – 2013-03-02 22:14:56
是的,用戶可以創建一個沒有Facebook的帳戶。但是,如果他們確實使用Facebook,那麼他們仍然會在Facebook用戶ID鏈接到的應用程序端擁有一個帳戶。 – Cameron 2013-03-03 12:09:05