2011-01-25 10 views
22

私のアプリケーションでは、次のような構造の「ユーザー」テーブルがあります。ソーシャルログインの実装のためのデータベース構造?

CREATE TABLE IF NOT EXISTS `users` (
    `userId` int(10) unsigned NOT NULL auto_increment, 
    `username` varchar(128) NOT NULL default '', 
    `password` varchar(32) NOT NULL default '', 
    `email` text NOT NULL, 
    `newsletter` tinyint(1) NOT NULL default '0', 
    `banned` enum('yes','no') NOT NULL default 'no', 
    `admin` enum('yes','no') NOT NULL default 'no', 
    `signup_ip` varchar(20) NOT NULL default '', 
    `activation_key` varchar(60) NOT NULL default '', 
    `resetpassword_key` varchar(60) NOT NULL default '', 
    `createdon` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`userId`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=27 ; 

私はStatckOverflowがやったように、私のアプリケーションでFacebookやTwitterとのOpenIDを経て、社会的ログインを実装したいです。 dbで必要となるすべての変更と、既存のログイン機能と一緒にPHPでロジックがどのように実装されるかを教えてください。

ありがとうございます!

答えて

23

私はあなたがAuthenticationProviderの概念を導入することを示唆している:

CREATE TABLE IF NOT EXISTS `AuthenticationProvider` (
`ProviderKey` varchar(128) NOT NULL, 
`userId` int(10) unsigned NOT NULL, 
`ProviderType` enum('facebook','twitter', 'google') NOT NULL, 
PRIMARY KEY (`ProviderKey`)) 
ENGINE=MyISAM DEFAULT CHARSET=latin1; 

各ログインプロバイダは、ユーザーの一意のキーを提供します。これはProviderKeyに格納されています。 ProviderTypeには、ProviderKeyが属するログインプロバイダに関する情報が含まれています。最後に、userId列には、情報がusersテーブルと結合されています。したがって、ログインプロバイダのいずれかから正常なログインを受け取ると、対応するProviderKeyがテーブルにあり、問題のユーザに対して認証Cookieを設定します。

ProviderTypeenumにしたいとは思えません。おそらくこれを保持できる別のテーブルを作る方が正しいでしょう。

ユーザーが最初にサイトに登録し、Facebook経由でログインすると、usersテーブルに行を作成する必要があります。ただし、password,activation_keyおよびresetpassword_keyは含まれません。したがって、これらのフィールドを別のテーブルに移動して、usersテーブルにはコアユーザーデータのみが含まれ、単一のログインメカニズム(ユーザー名/パスワード)にのみ関連するデータは含まれません。

これは意味があり、正しい方向にあなたを指し示すことを望みます。

/クラウス

+2

FacebookとTwitterのユーザーが同じキーを持つ場合はどうなりますか? –

+1

ProviderTypeを使ってそれらを区別することができます –

+0

@EjazKarim、これらのキーはシーケンシャルではないので、TwitterのデータベースにFacebookのデータベースと同じユーザーキーがある場合、私たちは実行を開始できます。 – Machado

関連する問題