Xây dựng và thiết lập chức năng Login/Register cho Drupal thông qua tà

Một phần của tài liệu Nghiên cứu giao thức OAuth và ứng dụng trong xác thực (Trang 44)

khoản Facebook

Thông thường người dùng không muốn chia sẻ tài khoản email hoặc thông tin cá nhân của họ với bất kỳ trang web nào trên mạng Internet vì rất mất thời gian cho việc đăng ký và có thể vì lý do bảo mật. Một cách hiệu quả hơn, trang web có thể tận dụng các dịch vụ đăng nhập của bên thứ ba như Google, Facebook hay Twitter...

Cộng đồng mạng cung cấp một số module như: drupal for facebook, facebook connect, facebook oauth... với rất nhiều chức năng trong đó có chức năng đăng nhập và đăng ký tài khoản người dùng Drupal thông qua Facebook. Ở đây tôi chỉ xây dựng module với chức năng đơn giản để hiểu hơn về cơ chế xác thực của giao thức OAuth.

Tên module: oafb.

Chức năng của module:

- Cho phép người dùng đăng nhập vào Drupal thông qua tài khoản và mật khẩu Facebook của họ.

- Nếu địa chỉ email của người dùng được tìm thấy trong cơ sở dữ liệu của Drupal thì người dùng được tự động đăng nhập. Ngược lại, một tài khoản mới được tạo ra trong Drupal với địa chỉ email đó và người dùng được chuyển sang trạng thái đã đăng nhập.

Ý tưởng thiết kế module:

- Tạo block với nút bấm “Login/Register via FB” để có thể đặt ở vị trí tùy ý trên trang Drupal.

- Đối tượng sử dụng nút bấm là người dùng chưa xác thực “Anonymous Users”.

- Cách hoạt động của module được minh họa trong sơ đồ như hình 3.10:

Hình 3.10. Cách hoạt động của oafb Chưa có

Rồi

Chưa Đăng nhập

Facebook

Lấy dữ liệu từ Facebook Email Verification Thêm dữ liệu vào bảng User Hủy Xác thực của Facebook Đã có Redirect Redirect Đồng ý Login/Register via FB User page Index page

Xây dựng module:

a. File oafb.info: Chứa các thông tin về module.

name = oafb

description = "Cho phep nguoi dung dang ki/dang nhap thong qua tai khoan Facebook"

core = 7.x

dependencies[] = libraries

configure = admin/config/people/oafb

Khai báo dependencies cho biết module oafb phụ thuộc vào module libraries. Muốn module này hoạt động thì người quản trị phải cài đặt và bật module libraries.

Khai báo configure cho biết đường dẫn tới trang cấu hình oafb cho quản trị viên Drupal điền vào các thông số: App ID và App Secret như hình 3.11. Trang cấu hình dành cho quản trị viên được viết trong file oafb.admin.inc.

Hình 3.11. Trang cấu hình module oafb

b. File oafb.module:

File này triển khai hook_block_view() với $block[content] = drupal_get_form('oafb_form');

nút này được bấm thì sẽ gọi hàm gọi lại oafb_login thông qua liên kết user/oafb được định nghĩa trong hook_menu().

Tạo nút bấm:

$form['submit'] = array(

'#type' => 'button',

'#value' => t('Login/Register via FB') );

$form['#action'] = url('user/oafb'); Định nghĩa một menu liên kết đến hàm gọi lại:

$items['user/oafb'] = array(

'title' => 'Login/Register via FB',

'page callback' => 'oafb_login',

'access callback' => 'user_is_anonymous',

);

Hàm gọi lại oafb_login() hoạt động như trong hình 3.8. Trong đó:

- Kiểm tra AppID của ứng dụng đã được thiết lập chưa trước khi thực hiện các lệnh khác dựa vào việc kiểm tra oafb_appid trong trang cấu hình module.

if (!variable_get('oafb_appid', 0))

- Nếu module đã được cấu hình đầy đủ thì tiến hành kiểm tra xem người dùng đã đăng nhập Facebook hay chưa thông qua giá trị của biến $fb_user sau khi gọi hàm lấy đối tượng Facebook:

$facebook = facebook_client();

$fb_user = $facebook->getUser();

- Nếu người dùng đã đăng nhập Facebook thì tiến hành kiểm tra email người dùng, nếu email đã có trong bảng user của cơ sở dữ liệu Drupal thì cho phép đăng nhập, nếu chưa có thì tạo tài khoản người dùng mới cho Drupal.

if ($fb_user) {

$fb_user_profile = $facebook->api('/me'); if (isset($fb_user_profile['email'])) {

$query = db_select('users', 'u');

$query->condition('u.mail', check_plain ($fb_user_profile['email'])); $query->fields('u', array('uid')); $query->range(0, 1); $drupal_user_id = 0; $result = $query->execute();

$drupal_user_id = $record->uid; } if ($drupal_user_id) { $user_obj = user_load($drupal_user_id); if ($user_obj->status) { $form_state = array(); $form_state['uid'] = $user_obj->uid; user_login_submit(array(), $form_state);

drupal_set_message(t('Ban da dang nhap voi

ten !username', array('!username' => $user_obj->name)));

drupal_goto('user');

}

else {

drupal_set_message(t('Tai khoan cua ban da

bi khoa'), 'error');

drupal_goto('user');

} }

else {

//tao tai khoan nguoi dung moi cho drupal $fb_username = (isset($fb_user_profile['username']) ? $fb_user_profile['username'] : $fb_user_profile['name']); $drupal_username_generated = oafb_unique_user_name(check_plain($fb_username)); $password = user_password(8); $fields = array( 'name' => $drupal_username_generated, 'mail' => check_plain($fb_user_profile['email']), 'pass' => $password, 'status' => 1,

'init' => 'email address', 'roles' => array(

DRUPAL_AUTHENTICATED_RID => 'authenticated user',

),

);

//luu tai khoan nguoi dung

$form_state = array();

$form_state['uid'] = $account->uid;

user_login_submit(array(), $form_state);

drupal_set_message(t('Ban da dang ki tai khoan voi ten !username', array('!username' => $account- >name)));

drupal_goto("user"); }

}

- Nếu người dùng chưa đăng nhập thì ta tạo ra URL đăng nhập Facebook rồi chuyển hướng người dùng:

$scope_string = '';

if (sizeof(module_implements('oafb_scope_info')) > 0) {

$scopes = module_invoke_all('oafb_scope_info',

array());

$scope_string = implode(',', $scopes); } $scope_string .= ',email'; $login_url_params = array( 'scope' => $scope_string, 'fbconnect' => 1, 'redirect_uri' => url('/user/oafb/1', array('absolute' => TRUE)) );

$login_url = $facebook-> getLoginUrl

($login_url_params);

drupal_goto($login_url); Hàm lấy đối tượng Facebook:

function facebook_client() { static $fb = NULL; if (is_null($fb)) { if (oafb_facebook_client_load_include()) { $init_params = array( 'appId' => variable_get('oafb_appid', ''), 'secret' => variable_get('oafb_skey', ''), ); $fb = new Facebook($init_params); }

}

return $fb; }

Một phần của tài liệu Nghiên cứu giao thức OAuth và ứng dụng trong xác thực (Trang 44)

Tải bản đầy đủ (PDF)

(57 trang)