2011-01-25 30 views
22

Trong ứng dụng của tôi, tôi có một bảng "người dùng" có cấu trúc sau.Cấu trúc cơ sở dữ liệu để triển khai đăng nhập xã hội?

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 ; 

Tôi muốn thực hiện đăng nhập xã hội qua facebook, twitter và openid trong ứng dụng của tôi, giống như StatckOverflow đã làm. Vui lòng đề xuất cho tôi tất cả những thay đổi tôi sẽ yêu cầu trong db của tôi và cách thực hiện logic trong PHP, cùng với cơ sở đăng nhập hiện tại.

Cảm ơn!

Trả lời

23

tôi sẽ đề nghị bạn nên giới thiệu các khái niệm về một 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; 

Mỗi nhà cung cấp đăng nhập cung cấp một khóa duy nhất cho người dùng. Điều này được lưu trữ trong ProviderKey. ProviderType chứa thông tin về nhà cung cấp đăng nhập nào ProviderKey này thuộc về và cuối cùng, cột userId kết hợp thông tin với bảng users. Vì vậy, khi bạn nhận được thông tin đăng nhập thành công từ một trong những nhà cung cấp đăng nhập, bạn tìm thấy ProviderKey tương ứng trong bảng và sử dụng đặt cookie xác thực cho người dùng được đề cập.

Tôi không chắc chắn rằng bạn muốn ProviderTypeenum. Nó có lẽ sẽ chính xác hơn để tạo ra một cái bàn khác có thể chứa chúng.

Khi người dùng đăng ký lần đầu với trang web của bạn và đăng nhập qua Facebook chẳng hạn, bạn sẽ phải tạo một hàng trong bảng users. Tuy nhiên, sẽ không có password, activation_keyresetpassword_key tham gia. Vì vậy, bạn có thể muốn di chuyển các trường đó sang một bảng riêng biệt, sao cho bảng users chỉ chứa dữ liệu người dùng cốt lõi và không có dữ liệu nào chỉ liên quan đến một cơ chế đăng nhập duy nhất (tên người dùng/mật khẩu).

Tôi hy vọng điều này có ý nghĩa và nó chỉ cho bạn đi đúng hướng.

/Klaus

+2

Điều gì sẽ xảy ra nếu người dùng từ Facebook và Twitter có cùng khóa? –

+1

ProviderType có thể được sử dụng để phân biệt chúng –

+0

@EjazKarim, các khóa này không phải là thứ tự, vì vậy nếu cơ sở dữ liệu của Twitter có cùng khóa cho người dùng làm cơ sở dữ liệu của Facebook, tôi nghĩ chúng ta có thể bắt đầu chạy. – Machado

Các vấn đề liên quan