Cảnh báo: Trang này nói về các API cũ hơn của Google, tức là Google Data API; trang này chỉ liên quan đến những API có trong thư mục Google Data API. Nhiều API trong số đó đã được thay thế bằng các API mới hơn. Để biết thông tin về một API mới cụ thể, hãy xem tài liệu về API mới đó. Để biết thông tin về cách uỷ quyền cho các yêu cầu bằng một API mới hơn, hãy xem phần Xác thực và uỷ quyền Tài khoản Google.
Tài liệu này mô tả cách sử dụng các thư viện ứng dụng Google Data API để kết nối với Phương thức xác thực AuthSub của Google cho các ứng dụng web.
Giao diện AuthSub cho phép một ứng dụng dựa trên web truy cập vào một dịch vụ của Google thay cho người dùng. Để duy trì mức độ bảo mật cao, giao diện AuthSub cho phép ứng dụng nhận được mã xác thực mà không cần xử lý thông tin đăng nhập tài khoản của người dùng.
Thư viện ứng dụng Google Data API cung cấp các phương thức giúp bạn sử dụng AuthSub trong ứng dụng web của mình. Cụ thể, có các phương thức để tạo URL yêu cầu, thu thập mã thông báo xác thực dùng một lần, trao đổi mã thông báo dùng một lần để lấy mã thông báo phiên và ký yêu cầu.
Lưu ý: Thư viện ứng dụng JavaScript có một phiên bản AuthSub riêng, được gọi là AuthSubJS. Để biết thông tin về cách sử dụng AuthSubJS trong các ứng dụng JavaScript, hãy xem phần Sử dụng phương thức xác thực "AuthSub" với Thư viện ứng dụng JavaScript.
Đối tượng
Tài liệu này dành cho những lập trình viên muốn ứng dụng dựa trên web của họ truy cập vào các dịch vụ của Google thay cho người dùng, bằng cách sử dụng các thư viện ứng dụng Google Data API.
Tài liệu này giả định rằng bạn đã quen thuộc với giao diện AuthSub và quy trình chung để kết hợp AuthSub vào ứng dụng web của mình. Để xem nội dung mô tả đầy đủ về giao thức AuthSub, hãy xem phần Xác thực AuthSub cho các ứng dụng web.
Sử dụng AuthSub và Google Data API mà không cần thư viện ứng dụng
Nếu muốn ứng dụng web tương tác với một dịch vụ dữ liệu của Google bằng AuthSub làm hệ thống xác thực, thì bạn chỉ cần biết mọi thứ trong phần Xác thực AuthSub cho ứng dụng web. Bạn không cần sử dụng thư viện ứng dụng Google Data API nếu không muốn.
Sau đây là thông tin tổng quan về cách ứng dụng của bạn có thể xác thực người dùng bằng AuthSub:
Ứng dụng của bạn tạo URL AuthSub thích hợp rồi gửi người dùng đến URL đó để họ có thể đăng nhập; hệ thống AuthSub sẽ gửi người dùng trở lại URL trên trang web mà bạn đã chỉ định và trả về một mã thông báo dùng một lần; ứng dụng của bạn có thể trao đổi mã thông báo đó để lấy mã thông báo phiên; sau đó, ứng dụng của bạn sẽ gửi mã thông báo trong tiêu đề Uỷ quyền cùng với mỗi yêu cầu mà ứng dụng gửi đến dịch vụ.
Thư viện ứng dụng Google Data API giúp đơn giản hoá quy trình cấp phép này bằng cách xử lý nhiều thông tin chi tiết cho bạn. Tài liệu này giải thích cách thực hiện.
Làm việc với AuthSub và Google Data API: ví dụ về thư viện ứng dụng
Phần này trình bày ví dụ về cách sử dụng các phương thức trong thư viện ứng dụng Google Data API để làm theo các bước được nêu trong phần "Làm việc với AuthSub" của tài liệu AuthSub.
Trong ví dụ này, chúng ta sẽ tích hợp giao diện AuthSub vào một ứng dụng web tương tác với Lịch Google (mặc dù bạn không cần biết gì về Lịch Google để làm theo ví dụ này). Ví dụ này giả định rằng ứng dụng web được lưu trữ tại example.com.
Quyết định loại mã thông báo cần sử dụng (session=0 hoặc session=1)
Bạn có thể chọn sử dụng mã thông báo dùng một lần (session=0) hoặc mã thông báo phiên (session=1).
Tài liệu này sẽ sử dụng mã thông báo phiên vì chúng hữu ích hơn trong các ứng dụng sẽ thực hiện nhiều yêu cầu API.
Như đã thảo luận trong tài liệu AuthSub, nếu quyết định sử dụng mã thông báo phiên trong ứng dụng web, bạn sẽ cần tự quản lý bộ nhớ mã thông báo. Tài liệu này không đề cập đến việc quản lý mã thông báo. Ngoài ra, hãy lưu ý rằng bạn không thể trao đổi (nâng cấp) mã thông báo được yêu cầu bằng session=0
thành mã thông báo phiên có thời gian tồn tại lâu dài sau này.
Quyết định xem bạn có nên đăng ký ứng dụng web của mình hay không (secure=0 hoặc secure=1)
Bạn có thể sử dụng AuthSub ở 3 chế độ: chưa đăng ký, đã đăng ký và đã đăng ký với chế độ bảo mật nâng cao. Phần còn lại của tài liệu này sẽ đề cập đến lựa chọn cuối cùng là AuthSub an toàn. Mặc dù chế độ chưa đăng ký/đã đăng ký dễ thiết lập hơn AuthSub an toàn, nhưng Google khuyến khích bạn sử dụng mã thông báo an toàn để tăng cường tính bảo mật.
Cách đăng ký
Khi bạn chọn Đăng ký cho ứng dụng dựa trên web, ứng dụng của bạn sẽ có những lợi ích sau:
- Mức độ bảo mật cao hơn.
- Được Google tin tưởng (người dùng sẽ không thấy cảnh báo trên trang Uỷ quyền của Google).
Đã đăng ký + AuthSub an toàn
Nếu quyết định sử dụng AuthSub bảo mật, bạn sẽ cần tạo một cặp khoá riêng tư và chứng chỉ công khai RSA tự ký ngoài việc đăng ký ứng dụng web của mình. Hãy xem phần Tạo khoá và chứng chỉ để sử dụng ở chế độ đã đăng ký (bên dưới) để biết ví dụ về cách tạo chứng chỉ X.509.
Xác định phạm vi truy cập dữ liệu
Mỗi dịch vụ của Google xác định một giá trị scope để xác định (và có thể thu hẹp) quyền truy cập của mã thông báo vào dữ liệu của người dùng.
Hãy xem phần Câu hỏi thường gặp để biết danh sách các giá trị scope hiện có.
Vì chúng ta quyết định tương tác với API Lịch Google, nên scope phải là http://www.google.com/calendar/feeds/.
Lưu ý: Luôn đặt giá trị phạm vi thành URL rộng nhất có thể, trừ phi bạn cần có một hạn chế chi tiết hơn.
Ví dụ: một phạm vi hẹp hơn như scope=http://www.google.com/calendar/feeds/default/allcalendars/full sẽ hạn chế quyền truy cập của mã thông báo chỉ vào nguồn cấp dữ liệu allcalendars/full. Việc sử dụng scope=http://www.google.com/calendar/feeds/ sẽ cho phép truy cập vào tất cả các nguồn cấp dữ liệu của Lịch: http://www.google.com/calendar/feeds/*.
Mã thông báo có nhiều phạm vi
Để tạo mã thông báo truy cập vào nhiều API dữ liệu của Google, hãy phân tách từng phạm vi bằng một dấu cách được mã hoá bằng URL. Ví dụ dưới đây tạo một mã thông báo sẽ có quyền truy cập vào cả dữ liệu Danh bạ Google và Lịch Google của người dùng.
scope=http://www.google.com/calendar/feeds/%20http://www.google.com/m8/feeds/
Yêu cầu mã thông báo xác thực dùng một lần
Để lấy mã thông báo AuthSub cho một người dùng và một dịch vụ nhất định, ứng dụng của bạn phải chuyển hướng người dùng đến URL AuthSubRequest. URL này sẽ nhắc người dùng đăng nhập vào Tài khoản Google của họ.
(Để biết thêm thông tin về URL AuthSubRequest, hãy xem toàn bộ bài viết Xác thực AuthSub cho ứng dụng web.)
Để tạo URL AuthSubRequest trong ứng dụng, hãy sử dụng thông tin sau cho từng thư viện ứng dụng:
Java
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request secure AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Nếu bạn muốn xác thực người dùng trên miền G Suite của mình:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
.NET
using Google.GData.Client; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
Nếu bạn muốn xác thực người dùng trên miền G Suite của mình:
using Google.GData.Client; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
PHP
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session);
Nếu bạn muốn xác thực người dùng trên miền G Suite của mình:
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $hostedDomain = 'example.com'; $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session) . '&hd=' . $hostedDomain;
Python
import gdata.auth next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session)
Nếu bạn muốn xác thực người dùng trên miền G Suite của mình:
import gdata.auth hosted_domain = 'example.com' next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session, domain=hosted_domain)
Sau khi tạo URL "tiếp theo", ứng dụng của bạn có thể sử dụng URL đó theo nhiều cách để gửi người dùng đến trình xử lý AuthSubRequest. Phương pháp phổ biến nhất là hiển thị một trang cho người dùng biết rằng họ cần phải làm theo một đường liên kết để cho phép ứng dụng của bạn truy cập vào Tài khoản Google của họ; sau đó, hãy đính kèm URL yêu cầu vào đường liên kết. Ví dụ: bạn có thể xuất chuỗi sau đây trong ứng dụng web của mình:
String authorizationUrl =
"<p>MyApp needs access to your Google Calendar account to read your Calendar feed. " +
"To authorize MyApp to access your account, <a href=\"" + authSubUrl + "\">log in to your account</a>.</p>";Người dùng truy cập vào đường liên kết đến trang AuthSub tại Google và đăng nhập. Sau đó, hệ thống AuthSub sẽ chuyển hướng người dùng trở lại ứng dụng của bạn bằng URL "next" mà bạn đã cung cấp.
Trích xuất mã thông báo dùng một lần
Khi Google chuyển hướng trở lại ứng dụng của bạn, mã thông báo sẽ được thêm vào URL "next" dưới dạng một tham số truy vấn. Trong trường hợp của các ví dụ ở trên, sau khi người dùng đăng nhập, Google sẽ chuyển hướng đến một URL như http://www.example.com/RetrieveToken?token=DQAADKEDE.
Ứng dụng của bạn phải trích xuất giá trị mã thông báo từ tham số truy vấn URL.
Nếu ứng dụng của bạn đặt một cookie xác thực trong trình duyệt của người dùng trước khi gửi họ đến hệ thống AuthSub, thì khi Google chuyển hướng trở lại URL "tiếp theo", ứng dụng của bạn có thể đọc cookie xác thực để nhận ra người dùng nào đã truy cập vào URL đó. Bạn có thể sử dụng cookie như vậy để liên kết mã nhận dạng người dùng trong ứng dụng của mình với mã thông báo AuthSub được truy xuất từ Google.
Các thư viện ứng dụng cung cấp các phương thức thuận tiện để trích xuất mã thông báo dùng một lần:
Java
String singleUseToken = AuthSubUtil.getTokenFromReply(httpServletRequest.getQueryString());
.NET
String singleUseToken = Request.QueryString["token"]; // or String singleUseToken = AuthSubUtil.getTokenFromReply(new Uri(Request.QueryString));
PHP
$singleUseToken = $_GET['token'];Python
current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url)
Nếu bạn đang sử dụng AuthSub bảo mật, hãy nhớ đặt khoá riêng tư RSA để tạo SecureAuthSubToken:
f = open('/path/to/yourRSAPrivateKey.pem') rsa_key = f.read() f.close() current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url, rsa_key=rsa_key)
Yêu cầu mã thông báo phiên
Mã thông báo mà bạn truy xuất từ URL luôn là mã thông báo dùng một lần. Bước tiếp theo là nâng cấp mã thông báo đó thành mã thông báo phiên có thời gian tồn tại lâu dài bằng cách sử dụng URL AuthSubSessionToken, như mô tả trong tài liệu đầy đủ về Xác thực AuthSub cho ứng dụng web. Nếu đang sử dụng AuthSub bảo mật, bạn cần đặt khoá riêng tư RSA trước khi thực hiện trao đổi. Sau đây là một số ví dụ sử dụng từng thư viện ứng dụng:
Java
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, null); // ready to interact with Calendar feeds
Đối với AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn đến exchangeForSessionToken thay vì truyền null:
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; java.security.PrivateKey privateKey = AuthSubUtil.getPrivateKeyFromKeystore("AuthSubExample.jks", "privKeyPa$$word", "AuthSubExample", "privKeyPa$$word"); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, privateKey); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, privateKey); // ready to interact with Calendar feeds
.NET
using Google.GData.Client; using Google.GData.Calendar; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
Đối với AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn đến exchangeForSessionToken thay vì truyền null:
using Google.GData.Client; using Google.GData.Calendar; protected AsymmetricAlgorithm getRsaKey() { X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx", "privKeyPa$$word"); RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider; return privateKey; } AsymmetricAlgorithm rsaKey = getRsaKey(); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, rsaKey).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; authFactory.PrivateKey = rsaKey; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
PHP
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken); // Create a Calendar service object and set the session token for subsequent requests $calendarService = new Zend_Gdata_Calendar(null, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
Đối với AuthSub an toàn, quá trình trao đổi yêu cầu bạn thiết lập Zend_Gdata_HttpClient trước và đặt khoá riêng tư RSA bằng cách sử dụng setAuthSubPrivateKeyFile():
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $client = new Zend_Gdata_HttpClient(); $client->setAuthSubPrivateKeyFile('/path/to/myrsakey.pem', null, true); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken, $client); $calendarService = new Zend_Gdata_Calendar($client, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
Python
import gdata.calendar import gdata.calendar.service calendar_service = gdata.calendar.service.CalendarService() calendar_service.UpgradeToSessionToken(single_use_token) # calls gdata.service.SetAuthSubToken() for you # ready to interact with Calendar feeds
Lưu ý: Quy trình này cũng tương tự đối với AuthSub bảo mật, miễn là bạn đã dùng gdata.auth.extract_auth_sub_token_from_url(url, rsa_key=rsa_key) để trích xuất mã thông báo dùng một lần.
Lưu ý: Khi sử dụng AuthSub bảo mật, chính khoá riêng tư của bạn sẽ không được gửi qua mạng. Các thư viện ứng dụng sẽ gửi chữ ký duy nhất được tạo bằng cách ký yêu cầu bằng khoá của bạn, chứ không phải chính khoá đó.
Sử dụng mã thông báo phiên
Bạn có thể sử dụng mã thông báo phiên để xác thực các yêu cầu đến máy chủ bằng cách đặt mã thông báo trong tiêu đề Uỷ quyền, như mô tả trong tài liệu AuthSub.
Sau khi thiết lập mã thông báo phiên, bạn có thể sử dụng các lệnh gọi thư viện ứng dụng API Dữ liệu của Google tiêu chuẩn để tương tác với dịch vụ mà không cần phải nghĩ về mã thông báo. Để biết thông tin chi tiết, hãy xem tài liệu về thư viện ứng dụng và hướng dẫn dành cho nhà phát triển API Dữ liệu của Google cho dịch vụ và ngôn ngữ mà bạn đang tương tác.
Truy xuất thông tin về mã thông báo phiên
Nếu muốn kiểm tra xem ứng dụng và máy chủ của bạn có đồng ý về các thông số của mã thông báo hay không, bạn có thể truyền mã thông báo đến trình xử lý AuthSubTokenInfo. Trình xử lý này sẽ trả về một tập hợp các cặp tên-giá trị chứa thông tin về mã thông báo.
Java
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, null);
Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn:
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, privateKey);
.NET
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, null);
Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn:
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, privateKey);
PHP
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken);Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền Zend_Gdata_HttpClient để yêu cầu được ký bằng khoá riêng tư RSA của bạn:
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken, $client);Python
token_info = calendar_service.AuthSubTokenInfo()
Thu hồi mã thông báo phiên
Mã thông báo phiên AuthSub không hết hạn; ứng dụng của bạn có thể lưu trữ mã thông báo phiên trong thời gian cần thiết.
Do đó, khi dùng xong mã phiên, ứng dụng có thể thu hồi mã này bằng trình xử lý AuthSubRevokeToken, như mô tả trong tài liệu AuthSub.
Ví dụ: nếu bạn muốn quản lý mã thông báo theo cách truyền thống như quản lý phiên, thì ứng dụng có thể nhận mã thông báo khi người dùng bắt đầu phiên và thu hồi mã thông báo đó khi người dùng kết thúc phiên.
Để thu hồi mã thông báo, hãy sử dụng mã sau trong mỗi thư viện ứng dụng:
Java
AuthSubUtil.revokeToken(sessionToken, null);
Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn:
AuthSubUtil.revokeToken(sessionToken, privateKey);
.NET
AuthSubUtil.revokeToken(sessionToken, null);
Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền khoá riêng tư RSA của bạn:
AuthSubUtil.revokeToken(sessionToken, privateKey);
PHP
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken);Nếu bạn đang sử dụng AuthSub bảo mật, hãy truyền Zend_Gdata_HttpClient để yêu cầu được ký bằng khoá riêng tư RSA của bạn:
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken, $client);Python
calendar_service.RevokeAuthSubToken()
Tài nguyên và mẫu khác
- Ví dụ về AuthSub trên Google Data API Tips Blog
- Thư viện ứng dụng Python Mẫu AuthSub
- Mẫu AuthSub trong thư viện ứng dụng Java
- Bài viết: Sử dụng AuthSub với Thư viện ứng dụng .NET
- Bài viết: Sử dụng phương thức xác thực "AuthSub" với Thư viện ứng dụng JavaScript
Tạo khoá riêng tư tự ký và chứng chỉ công khai để sử dụng với AuthSub bảo mật
Khoá riêng tư được dùng để tạo chữ ký và phải có trong mỗi yêu cầu. Google dùng khoá công khai được nhúng trong chứng chỉ để xác minh chữ ký. Khoá công khai phải là khoá RSA 1024 bit được mã hoá trong chứng chỉ X.509 ở định dạng PEM. Bạn nên gửi chứng chỉ cho Google tại thời điểm đăng ký.
Các phần sau đây cung cấp ví dụ về cách tạo khoá và chứng chỉ bằng hai công cụ cụ thể: tiện ích OpenSSL và tiện ích keytool của Java.
Những ví dụ này không dành riêng cho Google Data API; bạn có thể sử dụng các tiện ích tương tự để tạo khoá cho mọi mục đích.
Các ví dụ này giả định rằng công ty của bạn có tên là My_Company, có trụ sở tại Mountain View, California, Hoa Kỳ, với tên miền là example.com.
Tạo khoá bằng OpenSSL
Để tạo một cặp khoá RSA và chứng chỉ tương ứng, bạn có thể dùng lệnh sau:
# Generate the RSA keys and certificate openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \ '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \ myrsakey.pem -out /tmp/myrsacert.pem
Cảnh báo: Việc thêm tham số -nodes sẽ tạo một khoá riêng tư không có mật khẩu để bảo vệ khoá đó.
Tuy nhiên, bạn nên cân nhắc bỏ qua thông số này để tăng cường bảo mật.
Tham số -sha1 chỉ định rằng khoá sẽ được dùng để tạo chữ ký SHA1.
Tham số -subj chỉ định danh tính của ứng dụng mà chứng chỉ đại diện.
Tham số -keyout chỉ định tệp sẽ chứa các khoá.
Tệp này chứa thông tin nhạy cảm và cần được bảo vệ, không được chia sẻ với bất kỳ ai.
Tham số -out chỉ định tệp sẽ chứa chứng chỉ ở định dạng PEM (có thể được gửi đến Google trong khi đăng ký).
Tạo khoá cho ứng dụng .NET
Khung .NET không hiểu các khoá hoặc chứng chỉ được lưu trữ ở định dạng PEM. Do đó, bạn cần thực hiện thêm một bước sau khi tạo tệp .pem:
openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"
Bước này sẽ 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 được gửi đến Google Data API.
Tạo khoá cho ứng dụng Java
Ứng dụng Java chấp nhận khoá riêng tư ở định dạng PKCS#8. Sau khi tạo khoá/chứng chỉ bằng các chỉ dẫn ở trên, hãy tạo tệp .pk8 từ tệp .pem mà bạn đã tạo:
openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8
Ngoài ra, bạn có thể sử dụng kho khoá Java và tiện ích keytool để tạo một cặp khoá RSA và chứng chỉ tương ứng. Hãy sử dụng lệnh sau:
# Generate the RSA keys and certificate keytool -genkey -v -alias Example -keystore ./Example.jks\ -keyalg RSA -sigalg SHA1withRSA\ -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain View, ST=CA, C=US"\ -storepass changeme -keypass changeme
Cảnh báo: "changeme" không phải là một mật khẩu tốt; đây chỉ là một ví dụ.
Tham số -dname chỉ định danh tính của ứng dụng mà chứng chỉ đại diện. Tham số -storepass chỉ định mật khẩu để bảo vệ kho khoá. Tham số -keypass chỉ định mật khẩu để bảo vệ khoá riêng tư.
Để ghi chứng chỉ vào một tệp có thể dùng trong công cụ ManageDomains, hãy dùng lệnh sau:
# Output the public certificate to a file keytool -export -rfc -keystore ./Example.jks -storepass changeme \ -alias Example -file mycert.pem