Tháng 8 năm 2007
- Giới thiệu: Tại sao AuthSub lại quan trọng?
- Xử lý quy trình xác thực
- AuthSub an toàn (Đã đăng ký)
- Danh sách mã hoàn chỉnh
- Lời kết
Giới thiệu: Tại sao AuthSub lại quan trọng?
Ưu điểm của Google Data API ("GData" cho ngắn gọn) là cách chúng cho phép nhà phát triển tạo các ứng dụng tương tác với các dịch vụ của Google. Cụ thể hơn, các quyền này cho phép bạn truy cập vào dữ liệu riêng tư của người dùng để sử dụng trong ứng dụng của mình. Các API này cho phép bạn viết các ứng dụng để đồng bộ hoá, nhập, xuất và quản lý dữ liệu đó theo cách khác. Mặc dù các API này mang đến cho bạn những khả năng mạnh mẽ, nhưng bạn phải nhớ sử dụng chúng một cách có trách nhiệm. Vì dữ liệu người dùng là thông tin riêng tư, nên đương nhiên bạn muốn truy cập vào dữ liệu đó theo cách an toàn. Một phần quan trọng của việc này là có thể xác thực với các máy chủ của Google theo cách bảo mật.
Giả sử bạn có một ứng dụng web mới tuyệt vời mà bạn muốn liên kết với dữ liệu được lưu trữ trong các dịch vụ web của Google. Bây giờ, bạn muốn xác thực để truy cập vào dữ liệu riêng tư này. Tại sao không dùng một thứ đơn giản như ClientLogin? Cách này sẽ hiệu quả, nhưng sau đó bạn sẽ xử lý nhiều dữ liệu riêng tư hơn: thông tin đăng nhập của người dùng. ClientLogin yêu cầu ứng dụng của bạn hỏi tên người dùng và mật khẩu Google của người dùng. Điều này phù hợp với một ứng dụng dành cho máy tính đang chạy trên máy tính cá nhân của người dùng, nhưng không phù hợp với một ứng dụng dựa trên web. Ngoài trách nhiệm xử lý những thông tin đăng nhập này trên máy chủ của riêng bạn, có lẽ một số người dùng thận trọng hơn sẽ lo sợ rằng bạn có thể lưu trữ thông tin của họ. Một mối lo ngại thường gặp khác của người dùng là liệu họ chỉ muốn cấp cho một chương trình quyền truy cập vào một dịch vụ cụ thể (chẳng hạn như các sự kiện trên Lịch Google) chứ không muốn cấp quyền truy cập vào một số dịch vụ khác (chẳng hạn như Tài liệu Google) hay không. AuthSub giải quyết cả hai vấn đề này bằng cách cho phép người dùng xác thực thông qua các máy chủ của Google và chỉ cho phép chương trình của bạn yêu cầu quyền truy cập mà chương trình cần.
Giờ đây, khi đã đọc đủ về lý thuyết đằng sau AuthSub, đã đến lúc chuyển sang phần lập trình! Trong bài viết này, tôi chọn cách đơn giản và thực hiện mọi thứ trong một trang ASP duy nhất, nhưng bạn có thể dễ dàng tích hợp các kỹ thuật được minh hoạ ở đây vào ứng dụng của riêng mình.
Xử lý việc xác thực
Vậy bạn cần làm gì để thực sự sử dụng AuthSub trong ứng dụng web của mình? Trước tiên, có một số nội dung nhập tiêu chuẩn từ thư viện ứng dụng GData:
<%@ Import Namespace="Google.GData.Client" %> <%@ Import Namespace="Google.GData.Extensions" %> <%@ Import Namespace="System.Net" %>
Giờ đây, việc đầu tiên bạn phải làm là gửi người dùng đến một URL được tạo đặc biệt. Đây là những gì cho phép các máy chủ của Google xử lý quá trình xác thực, sau đó chuyển hướng người dùng trở lại trang web của bạn. May mắn là bạn không phải tạo URL này theo cách thủ công, vì có những phương thức giúp bạn làm việc này. Hãy xem ví dụ:
authSubUrl = AuthSubUtil.getRequestUrl(target, scope, secure, session);
- target Đây là một chuỗi chứa URL đến ứng dụng web của bạn. Đây là nơi người dùng sẽ được chuyển hướng đến sau khi xác thực.
- scope Chuỗi này được xác định bằng API mà bạn đang sử dụng. Tham số này tương ứng với một trong các nguồn cấp dữ liệu trong GData API. Ví dụ: nguồn cấp dữ liệu chứa tất cả thông tin lịch của một người dùng là "http://www.google.com/calendar/feeds/default/private/full".
- secure Đây là một giá trị boolean cho biết bạn đã đăng ký với Google và sẽ ký mật mã các yêu cầu của bạn đến máy chủ. Đối số này thường có giá trị mặc định là false, đặc biệt là khi bạn làm việc trong môi trường kiểm thử.
- session Đây là một boolean khác cho biết rằng bạn muốn có "mã thông báo phiên" thay vì "mã thông báo dùng một lần". Vai trò của đối số này sẽ rõ ràng hơn trong giây lát.
Sau khi nhấp vào URL được tạo, người dùng sẽ được chuyển đến một trang Tài khoản Google cho phép họ đăng nhập vào Tài khoản Google của mình. Sau đó, họ sẽ được chuyển hướng trở lại trang web mà bạn đã chỉ định trong biến "target", nhưng có một tham số truy vấn "token" chứa mã thông báo dùng một lần. Thông thường, bạn chỉ có thể sử dụng mã thông báo này đúng một lần. Tức là bạn có thể dùng thao tác này để thực hiện một hành động trên một nguồn cấp dữ liệu nhất định. Tuy nhiên, nếu bạn chỉ định tham số "session" là true, thì tham số này có thể được trao đổi để lấy "mã thông báo phiên" và có thể được dùng lại cho đến khi người dùng kết thúc phiên. Bạn có thể thực hiện việc này theo cách sau:
String token = Request.QueryString["token"]; Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString();
Tại đây, bạn trích xuất mã thông báo từ tham số truy vấn và trao đổi mã thông báo đó để lấy "mã thông báo phiên". Sau đó, để lưu mã thông báo này cho lần sử dụng sau, bạn có thể chọn lưu trữ mã thông báo trong mảng Session
tự động của .NET. Tất nhiên, bạn cũng có thể chọn lưu trữ mã thông báo trong cơ sở dữ liệu. Bước tiếp theo là sử dụng mã thông báo này để đưa ra một yêu cầu đã xác thực:
GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "My-Cool-Application"); authFactory.Token = (String) Session["token"]; CalendarService service = new CalendarService(authFactory.ApplicationName); service.RequestFactory = authFactory;
Tại đây, bạn thiết lập một đối tượng CalendarService để tương tác với API Lịch của Google bằng AuthSub để xác thực. Lưu ý rằng "cl" được dùng trong hàm khởi tạo cho GAuthSubRequestFactory
là tên dịch vụ của Lịch. Bạn có thể tham khảo Câu hỏi thường gặp về API dữ liệu của Google để biết tên của các dịch vụ khác.
AuthSub an toàn (Đã đăng ký)
Nếu chọn đăng ký ứng dụng web, thì bạn có thể bật thêm một lớp bảo mật khi sử dụng AuthSub. Điều này cho phép bạn ký điện tử tất cả các yêu cầu do mã của bạn thực hiện, nhờ đó, không ai có thể sử dụng mã thông báo AuthSub được cấp cho bạn trừ phi họ có khoá riêng tư của bạn. Bước đầu tiên là đảm bảo bạn đang tạo đúng đường liên kết AuthSub khi gọi AuthSubUtil.getRequestUrl
bằng cách đặt đối số "secure" thành true. Bạn cần thực hiện 2 thay đổi khác về mã:
String token = Request.QueryString["token"]; Session["token"] = AuthSubUtil.exchangeForSessionToken(token, rsaKey).ToString(); ... authFactory.PrivateKey = rsaKey;
Trước tiên, hãy lưu ý rằng thay vì null
, giờ đây bạn sẽ truyền biến "rsaKey" đến phương thức exchangeForSessionToken
. Biến này cũng được dùng để đặt một thuộc tính của GAuthSubRequestFactory
khi thiết lập kết nối với dịch vụ. Biến "rsaKey" là một RSACryptoServiceProvider
tương ứng với thành phần khoá riêng tư của chứng chỉ x509 mà bạn đã đăng ký với Google.
Việc tạo khoá riêng tư RSA và chứng chỉ tự ký có thể hơi khó hiểu, đặc biệt là vì khung .NET không hiểu các khoá hoặc chứng chỉ được lưu trữ ở định dạng PEM. Các lệnh sau đây cho biết cách tạo khoá riêng tư và chứng chỉ công khai bằng bộ công cụ OpenSSL:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \ '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \ test_key.pem -out test_cert.pem openssl pkcs12 -export -in test_cert.pem -inkey test_key.pem \ -out test_cert.pfx -name "Testing Certificate"
Bước đầu tiên sẽ tạo một khoá riêng tư và một chứng chỉ X509 công khai ở định dạng PEM có tên lần lượt là "test_key.pem" và "test_cert.pem". Xin lưu ý rằng chứng chỉ được đặt để đăng ký cho "www.example.com" ở Mountain View, California, Hoa Kỳ. Thay thế các giá trị phù hợp cho công ty của bạn tại đây. Tệp "test_cert.pem" chứa thông tin bạn cần gửi trên trang đăng ký AuthSub.
Bước thứ hai tạo một tệp PFX từ khoá riêng tư và chứng chỉ của bạn. Bạn có thể nhập tệp này vào thư viện ứng dụng .NET để ký điện tử các yêu cầu gửi đến API GData. Đoạn mã sau đây cho biết cách bạn có thể nhập khoá riêng tư từ tệp PFX vào một ứng dụng web:
protected AsymmetricAlgorithm getRsaKey() { X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx",""); RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider; return privateKey; }
Hàm getRsaKey()
do đoạn mã này xác định có thể được dùng thay cho biến "rsaKey" nêu trên khi dùng để xác thực với các API. Đương nhiên, bạn phải thay thế đường dẫn tệp bằng vị trí thích hợp của tệp PFX mà bạn đã tạo.
Danh sách mã hoàn chỉnh
Cách dễ nhất để cho thấy cách sử dụng các phương thức được minh hoạ trong phần trước là bằng một ví dụ thực tế. Đoạn mã mẫu sau đây là một trang ASP đơn giản sử dụng AuthSub để xác thực người dùng, sau đó in các sự kiện trong Lịch Google của họ.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <%@ Import Namespace="Google.GData.Client" %> <%@ Import Namespace="Google.GData.Extensions" %> <%@ Import Namespace="Google.GData.Calendar" %> <%@ Import Namespace="System.Net" %> <script runat="server"> void PrintCalendar() { GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "TesterApp"); authFactory.Token = (String) Session["token"]; CalendarService service = new CalendarService(authFactory.ApplicationName); service.RequestFactory = authFactory; EventQuery query = new EventQuery(); query.Uri = new Uri("http://www.google.com/calendar/feeds/default/private/full"); try { EventFeed calFeed = service.Query(query); foreach (Google.GData.Calendar.EventEntry entry in calFeed.Entries) { Response.Write("Event: " + entry.Title.Text + "<br/>"); } } catch (GDataRequestException gdre) { HttpWebResponse response = (HttpWebResponse)gdre.Response; //bad auth token, clear session and refresh the page if (response.StatusCode == HttpStatusCode.Unauthorized) { Session.Clear(); Response.Redirect(Request.Url.AbsolutePath, true); } else { Response.Write("Error processing request: " + gdre.ToString()); } } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Test Site</title> </head> <body> <form id="form1" runat="server"> <h1>AuthSub Sample Page</h1> <div> <% GotoAuthSubLink.Visible = false; if (Session["token"] != null) { PrintCalendar(); } else if (Request.QueryString["token"] != null) { String token = Request.QueryString["token"]; Session["token"] = AuthSubUtil.exchangeForSessionToken(token, null).ToString(); Response.Redirect(Request.Url.AbsolutePath, true); } else //no auth data, print link { GotoAuthSubLink.Text = "Login to your Google Account"; GotoAuthSubLink.Visible = true; GotoAuthSubLink.NavigateUrl = AuthSubUtil.getRequestUrl(Request.Url.ToString(), "http://www.google.com/calendar/feeds/",false,true); } %> <asp:HyperLink ID="GotoAuthSubLink" runat="server"/> </div> </form> </body> </html>
Kết luận
AuthSub cho phép ứng dụng web của bạn truy cập vào dữ liệu được lưu trữ trong Tài khoản Google của người dùng một cách an toàn và có kiểm soát. Việc sử dụng thư viện ứng dụng .NET giúp bạn dễ dàng tích hợp trang web dựa trên ASP với các dịch vụ của Google. Bài viết này chỉ giúp bạn bắt đầu, nhưng bạn nên tham khảo thêm các tài nguyên khác: