OpenID là gì và cách sử dụng OpenID

Posted by Admin, on 22/03/2011 05:21 PM in Lập trình with 16,229 views and 7 Comments

OpenID là gì và cách sử dụng OpenID - Image 1

OpenID là gì ? và cách để sử dụng OpenID ?

Bài viết sau đây sẽ hướng dẫn cụ thể giúp các bạn

Bài 1: OpenID là gì ?

Nói một cách đơn giản thì openid chính là một dịch vụ cho phép người dùng có thể truy cập vào một trang web bất kỳ bằng tài khoản Yahoo, Gmail, MyOpenid, wordpress, ALO, MySpace, Orange, VeriSign, , Yandex ... (đương nhiên là trang đó phải hỗ trợ đăng nhập bằng openid)

Nói đơn giản thì là thế còn ai thích tìm hiểu chi tiết thì lên google mà tìm nha (nhiều lắm đọc không hết)

Vậy cái này có lợi thế nào nhỉ?

- Về phía người dùng (hay người truy cập website của mình):

Chắc anh em đã từng gặp phải tình huống như thế này rùi nhỉ: Một ngày đẹp trời nọ, bạn lên google để tìm một phần mềm nào đó, sau khi tìm kiếm bạn thấy một forum có người share phần mềm đó và dĩ nhiên là bạn click vô để coi. Thấy hay quá bạn muốn download luôn nhưng nhìn đến download link thì có một dòng chữ đỏ lòm thế này: Chỉ thành viên mới nhìn thấy link (đăng nhập/đăng ký)

Bạn nhớ ra hôm trước mình cũng đã đăng ký một tài khoản ở forum này rùi nhưng không nhớ nổi tài khoản đó như thế nào  :-\. Thế là dĩ nhiên phải mất thời gian đăng ký một acc mới (nếu phải kích hoạt thì còn khổ nữa)  :'(

Vì thế nên nếu forum đó có hỗ trợ đăng nhập bằng tài khoản Yahoo hay Gmail thì có phải là bạn đỡ phải nhớ xem liệu mình đã đăng ký tài khoản trên forum đó hay chưa hoặc tài khoản đó như thế nào (bởi vì hầu như ai chẳng có ít nhất một cái nick Yahoo hay Gmail). Nếu được như vậy thì quá tiện rùi còn gì.

- Về phía chúng ta (nhưng người quản trị website):

Tự nhiên đỡ phải chế tạo ra mấy thứ như: trang đăng ký, kích hoạt tài khoản, quản lý thông tin tài khoản, lấy lại mật khẩu, ... Nhàn quá rùi còn gì  ;D

Lợi thế là quá rõ ràng nhưng cũng không phải không có hạn chế:

- Mất quyền "sinh sát" tài khoản trong tay (chỉ có thể cấm người ta đăng nhập bằng một tài khoản nào đó mà thôi). Nếu chẳng may tài khoản của người dùng bị nhà cung cấp tài khoản đó xóa mất thì chúng ta cũng chỉ có thể ... trơ mắt ếch mà nhìn, chẳng có cách nào khôi phục lại cho họ.

- Không thích hợp lắm khi triển khai trên host free (tại sao như thế thì tí nữa nói)

Bài 2: OpenID hoạt động như thế nào?

Nó hoạt động theo kiểu này (mô tả nôm na thôi nhá):

Đầu tiên chúng ta yêu cầu người dùng chọn nhà cung cấp tài khoản (tức là hỏi xem họ định dùng nick yahoo, gmail, myopenid hay myspace , ... để đăng nhập)

Nếu bạn đã thử một vài demo openid hay xem video demo thì sẽ thấy họ nhập yêu cầu chúng ta nhập vào một địa chỉ URL của nhà cung cấp dịch vụ openid. Ví dụ định đăng nhập bằng tài khoản của Yahoo thì nhập vào là https://me.yahoo.com hoặc http://yahoo.com

Cách này giúp ta có thể cho đăng nhập bằng tất cả các nhà cung cấp dịch vụ openid. Khi đó người dùng sẽ phải tự tìm hiểu xem URL của nhà cung cấp dịch vụ mình đang dùng là gì. Điều này rõ ràng là không khả thi lắm với những người dùng có trình độ tin học thấp.

Như vậy cách đơn giản hơn là chúng ta tự thiết lập một số URL sẵn rùi ai muốn dùng loại nào thì click là xong. Việc này cũng giúp ta giới hạn người dùng chỉ được đăng nhập bằng một số loại tài khoản nhất định (ví dụ như chỉ cho họ đăng nhập bằng tài khoản Yahoo và Gmail)

Tiếp theo sau khi họ đã chọn được rùi thì ta cần kiểm tra lại yêu cầu của họ và gửi yêu cầu cho nhà cung cấp dịch vụ của họ để cho họ đăng nhập. Điều này giống như chúng ta nói với nhà cung cấp của họ là: "Có thằng này muốn đăng nhập vào site của em bằng tài khoản của các bác, các bác kiểm tra giúp em cái, nếu đúng thì nói với em một tiếng nhá, tiện thể gửi luôn cho em cái địa chỉ email với họ tên nó nha  OpenID là gì và cách sử dụng OpenID - Image 2"

Sau khi họ đăng nhập thành công thì nhà cung cấp sẽ hỏi họ "Bạn có muốn sử dụng tài khoản xxxx của bạn để truy cập website yyyy không?" Nếu họ xác nhận thì nhà cung cấp đó sẽ gửi lại xác nhận cho chúng ta, kèm theo đó là một vài thông tin về người dùng đó (nhưng thông tin đó là do ta yêu cầu, nếu người dùng xác nhận thì họ sẽ gửi luôn cho chúng ta. Tất nhiên là bạn không thể yêu cầu họ giao password hay các thông tin bảo mật khác).

Cuối cùng sau khi có được xác nhận của đối phương và những thông tin cần thiết mà nhà cung cấp đó gửi lại thì việc sử lý thông tin đó như thế nào là việc của chúng ta (ví dụ như lưu vào CSDL, session, ...)

Nếu muốn trực tiếp thử nghiệm bạn có thể vào http://openid-demo.appspot.com/

hoặc xem clip này: http://www.youtube.com/watch?v=f_BG5DWiHMo

Bài 3: tạo trang đăng nhập openid bằng php

Đầu tiên bạn phải chắc chắn rằng host của mình hỗ trợ 3 thứ sau:

- cURL

- bcmath

- OpenSSL

Nếu không có đủ thì coi như vứt. Đấy chính là lý do tại sao mình nói host free không hợp với việc dùng openid. Vì không có nhiều host free hỗ trợ đầy đủ 3 thứ này lắm.

Tiếp theo bạn cần chọn một thư viện OpenId cho mình tại http://openid.net/developers/libraries/#php

Để cho đơn giản mình sẽ hướng dẫn sài thư viện LightOpenId vì thư viện này đơn giản mà rất dễ dùng.

Đầu tiên là code class LightOpenId (đỡ mất công tìm download):

http://gitorious.org/lightopenid/lightopenid/trees/master

Sau khi download về, các bạn sẽ có 2 file là example.phpopenid.php

Các bạn chạy file example.php, nó sẽ hiện lên 1 ô input để nhập dịch vụ mà mình muốn sử dụng

VD 1 số trang cung cấp dịch vụ OpenID:

  1. Yahoo: https://me.yahoo.com
  2. Google: https://www.google.com/accounts/o8/id
  3. MyOpenId: http://myopenid.com
  4. MySpace: http://www.myspace.com/username
  5. Wordpress: http://wordpress.com
  6. ALO: http://openid.aol.com

Các bạn nhập link 1 trong các địa chỉ trên vào ô input và nhấn Submit

Sau khi nhập vào (ví dụ như https://me.yahoo.com) thì chúng ta kiểm tra lại và chuyển đến trang đăng nhập của nhà cung cấp dịch vụ đó

Phần kiểm tra URL của nhà cung cấp sẽ được LightOpenId thực hiện khi ra gọi phương thức $openid->authUrl(). Nếu không có gì sai nó sẽ trả lại giá trị là một URL. Đây cũng chính là URL của trang đăng nhập của nhà cung cấp dịch vụ openid mà người dùng yêu cầu. Tất nhiên là url này sẽ khác với URL mà người dùng nhập vào. Quá trình sử lý thế nào để có được URL đó thì chúng ta không cần quan tâm. chỉ cần biết trong url đó có chứa một vài thông tin về yêu cầu của chúng ta như: url trang đăng nhập của ta để sau khi đăng nhập bên phía họ xong thì họ sẽ chuyển (redirect) lại trang của ta, các thông tin ta muốn lấy của người dùng (như email, tên, giới tính, ...), ...

Để có thể yêu cầu lấy các thông tin của người dùng chúng ta thêm code như thế này vào trước khi gọi $openid->authUrl()

  1. $openid->required = array('namePerson/friendly', 'contact/email'); //các thông tin bắt buộc phải lấy
  2. $openid->optional = array('namePerson/first'); // các thông tin tùy chọn, có hay không cũng được

Bạn có thể yêu cầu các thông tin sau:

  1. 'namePerson/friendly'     => Tên gọi
  2. 'contact/email'           => Email
  3. 'namePerson'              => Tên đầy đủ
  4. 'birthDate'               => Ngày sinh
  5. 'person/gender'           => Giới tính
  6. 'contact/postalCode/home' => Mã bưu chính
  7. 'contact/country/home'    => Quốc tịch
  8. 'pref/language'           => Ngôn ngữ
  9. 'pref/timezone'           => Múi giờ

Chỉ cần nhét các thông tin cần lây vào mảng như code ví dụ trên là được.

Bạn cũng có thể thay đổi địa chỉ URL mà nhà cung cấp sẽ chuyển tới sau khi người dùng đăng nhập và xác nhận trên site của họ bằng cách thêm dòng sau vào trước khi gọi phương thức $openid->authUrl()

  1. $openid->returnUrl = "URL sẽ nhận kết quả";

Lưu ý là URL này phải trên cùng một site với trang gửi yêu cầu đăng nhập đâu nhá.

Tiếp đến là việc người dùng đăng nhập trên site của nhà cung cấp thì ta không can thiệp được

Sau nữa là nhận kết quả từ phía nhà đăng nhập:

Bạn nên biết là sau khi được người dùng của bạn xác nhận rằng sẽ dùng tài khoản của họ để đăng nhập vào site bạn thì nhà cung cấp sẽ đính các thông tin vào chuỗi query string (chính là phần sau dấu ? trên URL) trên URL sẽ nhận kết quả. Cụ thể có một biến quan trọng nhất là $_GET["openid_mode"] (cụ thể trên URL được chuyển tới sẽ có thêm openid_mode=xxxx). Nếu biến này không tồn tại tức là người dùng chưa có kết quả trả về hay người dùng chưa được chuyển đi đăng nhập trên site của nhà cung cấp. Lúc đó ta sẽ chuyển họ đi. Điều này giải thích cho đoạn code:

  1. if(!isset($_GET['openid_mode'])) {
  2. if(isset($_POST['openid_identifier'])) {
  3. $openid = new LightOpenID;
  4. $openid->identity = $_POST['openid_identifier'];
  5. header('Location: ' . $openid->authUrl());
  6. }

Nếu $_GET["openid_mode"] == "cancel" thì tức là người dùng đã hủy bỏ việc đăng nhập trên site của nhà cung cấp dịch vụ openid. Code thông báo việc này là đoạn:

  1. elseif($_GET['openid_mode'] == 'cancel') {
  2. echo 'User has canceled authentication!';

Còn lại đương nhiên là người dùng đã tiến hành đăng nhập rùi. Lúc này ta dùng phương thức $openid->validate() để kiểm tra lại kết quả (vì chỉ có trời mới biết URL hiện tại có phải do người dùng ngụy tạo ra để lừa ta là họ đã đăng nhập rùi không). Quá trình kiểm tra thế nào ta cũng chẳng cần quan tâm. Chỉ cần biết nếu nhận được giá trị true thì thông tin xác nhận ta nhận được là chuẩn xác và ngược lại

  1. else {
  2. $openid = new LightOpenID;
  3. echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
  4. }

Cái thuộc tính $openid->identity lúc này sẽ chính là một URL riêng của người dùng do nhà cung cấp dịch vụ của họ cấp cho họ. Ta có thể dùng cái này như một chỉ số ID của họ.

Tiếp theo để lấy được những thông tin mà ta yêu cầu thì chúng ta chỉ cần dùng phương thức $openid->getAttributes(). Nó sẽ trả lại một mảng chứa các thông tin chúng ta yêu cầu. Muốn xem trong mảng đó có những gì thì chỉ việc dùng hàn print_r() mà in ra để xem. Việc đăng nhập cho người dùng vào site của bạn và dùng những thông tin lấy được này như thế nào là việc của bạn, chẳng ai quản được.

Chúc bạn thành công

Bài viết đc sưu tầm và chỉnh sửa lại chút ít

OpenID là gì và cách sử dụng OpenIDOpenID là gì và cách sử dụng OpenID
Nhận xét
Bạn còn ký tự