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 Xác thực OAuth cho ứng dụng web của Google.
Giao diện OAuth 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, OAuth cho phép ứng dụng nhận mã truy cập 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 OAuth trong ứng dụng web của mình. Cụ thể, có các phương thức để tạo mã thông báo yêu cầu, uỷ quyền mã thông báo yêu cầu và trao đổi mã thông báo yêu cầu được uỷ quyền để lấy mã truy cập. Các thư viện này cũng xử lý các thuật toán ký cần thiết khi đưa ra yêu cầu cho một dịch vụ dữ liệu của Google.
Đố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 OAuth và quy trình chung để kết hợp OAuth vào ứng dụng web của mình. Để biết nội dung mô tả đầy đủ về giao thức của OAuth, hãy xem bài viết Xác thực OAuth cho các ứng dụng web hoặc thông số kỹ thuật chính thức tại oauth.net.
Sử dụng OAuth 3 chân và Google Data API mà không cần thư viện ứng dụng
Nếu bạn muốn ứng dụng web của mình tương tác với một dịch vụ Dữ liệu của Google bằng cách sử dụng OAuth làm phương thức uỷ quyền, thì mọi thông tin bạn cần biết đều có trong phần Xác thực OAuth 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 OAuth:
- Ứng dụng của bạn đưa ra một yêu cầu đã ký để tìm nạp mã thông báo yêu cầu OAuth ban đầu từ điểm cuối
OAuthRequestToken. - Ứng dụng của bạn chuyển hướng người dùng đến URL
OAuthAuthorizeTokenthích hợp để uỷ quyền mã thông báo yêu cầu. - Sau khi được cấp quyền truy cập, người dùng sẽ được chuyển hướng trở lại ứng dụng của bạn (URL
oauth_callback) - Ứng dụng của bạn gửi một yêu cầu đã ký để nâng cấp mã thông báo yêu cầu được uỷ quyền thành mã truy cập bằng cách sử dụng điểm cuối
OAuthGetAccessToken.
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.
Đăng ký ứng dụng web
OAuth yêu cầu tất cả các lệnh gọi API đều phải được ký bằng chữ ký số. Google hỗ trợ các phương thức chữ ký HMAC-SHA1 và RSA-SHA1. Để ký các yêu cầu, trước tiên, ứng dụng của bạn cần phải đăng ký với Google. Sau khi bạn đăng ký, Google sẽ cung cấp cho bạn một khoá người dùng (và khoá bí mật để dùng với HMAC-SHA1) cũng như một nơi để tải chứng chỉ công khai lên.
1. Đăng ký miền
Vui lòng làm theo các bước nêu trong phần Đăng ký ứng dụng dựa trên web.
2. Tạo cặp khoá riêng tư / chứng chỉ công khai (không bắt buộc)
Nếu chọn sử dụng RSA-SHA1 làm oauth_signature_method, bạn cần tạo một cặp khoá riêng tư và chứng chỉ công khai tự ký RSA. Hãy xem phần Tạo khoá riêng tư tự ký và chứng chỉ công khai (bên dưới) để biết ví dụ về cách thực hiện.
Làm việc với OAuth 3 chân và Google Data API: ví dụ về thư viện ứng dụng
Các phần sau đâ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 để thực hiện các bước được nêu trong phần "Làm việc với OAuth" của tài liệu về OAuth. Tất cả ví dụ trong tài liệu này đều giả định rằng miền lưu trữ ứng dụng của bạn là example.com.
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 quyền truy cập của mã thông báo vào dữ liệu của người dùng. Các giá trị phạm vi có thể sử dụng được liệt kê trong Câu hỏi thường gặp về dữ liệu của Google. Ví dụ: để sử dụng Documents List API, hãy đặt scope thành https://docs.google.com/feeds/, như được liệt kê trong phần Câu hỏi thường gặp.
Lưu ý: Đặt giá trị scope thành URL hẹp nhất cho phép bạn truy cập vào những gì bạn cần. Điều này giúp giảm nguy cơ vô tình thu thập và làm rò rỉ dữ liệu cá nhân. Ví dụ: nếu bạn muốn truy cập vào nguồn cấp dữ liệu Danh sách tài liệu riêng tư của người dùng hiện tại, hãy sử dụng phạm vi https://docs.google.com/feeds/default/private/full thay vì phạm vi rộng hơn như https://docs.google.com/feeds/, phạm vi này cho phép truy cập vào tất cả nguồn cấp dữ liệu Danh sách tài liệu.
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 dấu cách. Ví dụ dưới đây minh hoạ cách tạo một mã thông báo có quyền truy cập vào cả dữ liệu Google Tài liệu và Google Lịch của người dùng.
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
Mã hoá URL
Các ký tự không phải ASCII xuất hiện trong URL (bao gồm cả dấu hai chấm, dấu gạch chéo và dấu cách) phải được mã hoá URL để được truyền qua HTTP. Thư viện ứng dụng Google Data API sẽ tự động mã hoá URL cho các tham số, vì vậy, bạn chỉ cần sử dụng các chuỗi không được mã hoá URL khi chỉ định giá trị cho các tham số. Ví dụ: bạn có thể thực hiện việc chỉ định sau đây trong mã của mình:
scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
Khi bạn gọi thư viện ứng dụng, tham số
scope sẽ tự động được mã hoá URL thành giá trị sau:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f
Tìm nạp mã thông báo yêu cầu
Java
Đối với HMAC-SHA1, bạn cần có cách nào đó để duy trì bí mật mã thông báo (nhận được trong phản hồi) nhằm tạo một đối tượng mã thông báo OAuth quay lại từ trang phê duyệt. Để làm như vậy, hãy đặt một biến phiên hoặc cookie.
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; String CONSUMER_SECRET = "abc123doremi"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setScope("https://docs.google.com/feeds/"); oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); oauthHelper.getUnauthorizedRequestToken(oauthParameters);
Khi dùng RSA-SHA1, oauth_token_secret sẽ không được dùng nên bạn không cần duy trì mã thông báo bí mật.
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setScope("https://docs.google.com/feeds/"); oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp"); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey)); oauthHelper.getUnauthorizedRequestToken(oauthParameters); ... public static PrivateKey getPrivateKey(String privKeyFileName) { File privKeyFile = new File(privKeyFileName); FileInputStream fis = new FileInputStream(privKeyFile); DataInputStream dis = new DataInputStream(fis); byte[] privKeyBytes = new byte[(int) privKeyFile.length()]; dis.read(privKeyBytes); dis.close(); fis.close(); String BEGIN = "-----BEGIN PRIVATE KEY-----"; String END = "-----END PRIVATE KEY-----"; String str = new String(privKeyBytes); if (str.contains(BEGIN) && str.contains(END)) { str = str.substring(BEGIN.length(), str.lastIndexOf(END)); } KeyFactory fac = KeyFactory.getInstance("RSA"); EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(Base64.decode(str)); return fac.generatePrivate(privKeySpec); }
PHP
Sử dụng HMAC-SHA1 làm phương thức chữ ký:
require_once 'Zend/Oauth/Consumer.php'; session_start(); $CONSUMER_KEY = 'example.com'; $CONSUMER_SECRET = 'abc123doremi'; // Multi-scoped token. $SCOPES = array( 'https://docs.google.com/feeds/', 'https://spreadsheets.google.com/feeds/' ); $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => $CONSUMER_SECRET, 'signatureMethod' => 'HMAC-SHA1', 'callbackUrl' => 'http://myapp.example.com/access_token.php', 'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken' ); $consumer = new Zend_Oauth_Consumer($oauthOptions); // When using HMAC-SHA1, you need to persist the request token in some way. // This is because you'll need the request token's token secret when upgrading // to an access token later on. The example below saves the token object as a session variable. if (!isset($_SESSION['ACCESS_TOKEN'])) { $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => implode(' ', $SCOPES)))); }
Sử dụng RSA-SHA1 làm phương thức chữ ký:
require_once 'Zend/Crypt/Rsa/Key/Private.php'; require_once 'Zend/Oauth/Consumer.php'; session_start(); $CONSUMER_KEY = 'example.com'; $SCOPE = 'https://docs.google.com/feeds/'; $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => new Zend_Crypt_Rsa_Key_Private(file_get_contents(realpath('/path/to/yourRSAPrivateKey.pem'))), 'signatureMethod' => 'RSA-SHA1', 'callbackUrl' => 'http://myapp.example.com/access_token.php', 'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken', 'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken', 'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken' ); $consumer = new Zend_Oauth_Consumer($oauthOptions); if (!isset($_SESSION['ACCESS_TOKEN'])) { $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => $SCOPE))); }
Python
Sử dụng HMAC-SHA1 làm phương thức chữ ký:
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
import gdata.gauth import gdata.docs.client CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/'] # example of a multi-scoped token client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1') oauth_callback_url = 'http://%s/get_access_token' % self.request.host request_token = client.GetOAuthToken( SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) # When using HMAC-SHA1, you need to persist the request_token in some way. # You'll need the token secret when upgrading to an access token later on. # In Google App Engine, you can use the AeSave helper: # gdata.gauth.AeSave(request_token, 'myKey')
Sử dụng RSA-SHA1 làm phương thức chữ ký:
... f = open('/path/to/yourRSAPrivateKey.pem') RSA_KEY = f.read() f.close() request_token = client.GetOAuthToken(SCOPES, oauth_callback_url, CONSUMER_KEY, rsa_private_key=RSA_KEY)
Ngoài ra, nếu bạn đang dùng các lớp v1.0 cũ dựa trên GDataService, thì các lệnh gọi sẽ hơi khác:
import gdata.auth import gdata.docs.service CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) req_token = client.FetchOAuthRequestToken() client.SetOAuthToken(req_token)
Sử dụng RSA-SHA1 làm phương thức chữ ký:
... f = open('/path/to/yourRSAPrivateKey.pem') RSA_KEY = f.read() f.close() client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY) SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/'] # example of a multi-scoped token req_token = client.FetchOAuthRequestToken(scopes=SCOPES) client.SetOAuthToken(req_token)
.NET
Sử dụng HMAC-SHA1 làm phương thức chữ ký:
using Google.GData.Client; string CONSUMER_KEY = "example.com"; string CONSUMER_SECRET = "abc123doremi"; // Multi-scoped token. string SCOPE = "https://www.google.com/calendar/feeds/ https://www.google.com/m8/feeds/"; OAuthParameters parameters = new OAuthParameters() { ConsumerKey = CONSUMER_KEY, ConsumerSecret = CONSUMER_SECRET, Scope = SCOPE, Callback = "http://myapp.example.com/access_token", SignatureMethod = "HMAC-SHA1" } OAuthUtil.GetUnauthorizedRequestToken(parameters);
Sử dụng RSA-SHA1 làm phương thức chữ ký:
RSA-SHA1 is not supported yet.
Uỷ quyền cho mã thông báo yêu cầu
Để uỷ quyền mã thông báo yêu cầu, ứng dụng của bạn phải chuyển hướng người dùng đến URL OAuthAuthorizeToken. 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 OAuthAuthorizeToken, hãy xem bài viết đầy đủ về Xác thực OAuth cho ứng dụng web.
Để tạo URL OAuthAuthorizeToken trong ứng dụng, hãy sử dụng thông tin sau cho từng thư viện ứng dụng. Xin lưu ý rằng các mẫu này được xây dựng dựa trên các ví dụ trước.
Sau khi tạo URL trang phê duyệt, ứng dụng của bạn có thể sử dụng URL này theo nhiều cách để gửi người dùng đến trình xử lý OAuthAuthorizeToken. Cách phổ biến nhất là chuyển hướng người dùng hoặc hiển thị một đường liên kết đến trang đó.
Java
Đối với HMAC-SHA1:
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
Đối với RSA-SHA1:
String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters); System.out.println(approvalPageUrl);
PHP
// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com'). $approvalUrl = $consumer->getRedirectUrl(array('hd' => 'default')); echo "<a href=\"$approvalUrl\">Grant access</a>";
Ngoài ra, bạn có thể chỉ cần chuyển hướng đến URL phê duyệt:
// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com'). $consumer->redirect(array('hd' => 'default'));
Python
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
# req_token is from previous call to client.GetOAuthToken() domain = None # If on a G Suite domain, use your domain (e.g. 'example.com'). self.redirect(request_token.generate_authorization_url(google_apps_domain=domain))
Nếu bạn đang sử dụng các lớp v1.0 cũ dựa trên GDataService, thì quy trình này sẽ hơi khác.
# req_token is from previous call to client.FetchOAuthRequestToken() oauth_callback_url = 'http://%s/get_access_token' % self.request.host self.redirect(client.GenerateOAuthAuthorizationURL(callback_url=oauth_callback_url))
.NET
string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters); Console.WriteLine(authorizationUrl);
Trích xuất mã thông báo từ URL gọi lại
Khi Google chuyển hướng trở lại ứng dụng của bạn, oauth_token sẽ được thêm vào URL "oauth_callback_url" dưới dạng một tham số truy vấn.
Sau đó, ứng dụng của bạn sẽ trích xuất giá trị mã thông báo từ tham số truy vấn URL và thiết lập lại các tham số oauth.
Các thư viện ứng dụng cung cấp các phương thức tiện lợi để trích xuất oauth_token. Các mẫu này được xây dựng dựa trên các ví dụ trước.
Java
Nếu bạn chọn duy trì khoá bí mật của mã thông báo trong URL lệnh gọi lại (khi dùng HMAC-SHA1):
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer()); oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);
Điểm khác biệt duy nhất với RSA-SHA1 là phương thức ký:
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey)); oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);
PHP
Bạn không cần thực hiện bước này khi sử dụng thư viện PHP.
Python
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
# Recall request_token. In Google App Engine, use AeLoad(): # saved_request_token = gdata.gauth.AeLoad('myKey') request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)
Nếu bạn đang sử dụng các lớp v1.0 cũ dựa trên GDataService, hãy sử dụng:
oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri) if oauth_token: oauth_token.secret = # TODO: recall saved request_token and set the token secret here. oauth_token.oauth_input_params = gdata.auth.OAuthInputParams( gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) client.SetOAuthToken(oauth_token) else: print 'No oauth_token found in the URL'
Quy trình này tương tự như đối với RSA-SHA1, nhưng không có khoá bí mật của mã thông báo:
oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri) if oauth_token: oauth_token.oauth_input_params = gdata.auth.OAuthInputParams( gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY) client.SetOAuthToken(oauth_token) else: print 'No oauth_token found in the URL'
.NET
Nếu bạn đã chọn duy trì bí mật mã thông báo trong URL lệnh gọi lại:
OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);
Nâng cấp lên mã truy cập
Bước cuối cùng trong quy trình trao đổi mã thông báo OAuth là nâng cấp mã thông báo yêu cầu được uỷ quyền thành mã thông báo truy cập có thời hạn sử dụng dài bằng cách sử dụng URL OAuthGetAccessToken, như mô tả trong tài liệu đầy đủ về Xác thực OAuth cho ứng dụng web.
Sau đây là một số ví dụ sử dụng từng thư viện ứng dụng:
Java
String accessToken = oauthHelper.getAccessToken(oauthParameters); // You can also pull the OAuth token string from the oauthParameters: // String accessToken = oauthParameters.getOAuthToken(); System.out.println("OAuth Access Token: " + accessToken); String accessTokenSecret = oauthParameters.getOAuthTokenSecret(); System.out.println("OAuth Access Token's Secret: " + accessTokenSecret);
PHP
if (!isset($_SESSION['ACCESS_TOKEN'])) { if (!empty($_GET) && isset($_SESSION['REQUEST_TOKEN'])) { $_SESSION['ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN']))); } }
Python
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
# Upgrade the token and save in the user's datastore access_token = client.GetAccessToken(request_token) # If you're using Google App Engine, you can call the AeSave() method to save # the access token under the current logged in user's account. #gdata.gauth.AeSave(access_token, token_key)
Nếu bạn đang sử dụng các lớp v1.0 cũ dựa trên GDataService, hãy sử dụng:
access_token = client.UpgradeToOAuthAccessToken() # calls SetOAuthToken() for you
Nếu bạn đang sử dụng gdata.gauth.AeSave() trên App Engine, mã thông báo và khoá bí mật của mã thông báo sẽ được lưu trữ cho bạn trong tài khoản người dùng hiện đang đăng nhập.
.NET
OAuthUtil.GetAccessToken(parameters); // If you want to extract the OAuth Token/TokenSecret from the OAuthParameters instance: string accessToken = parameter.Token; Console.WriteLine("OAuth Access Token: " + accessToken); string accessTokenSecret = parameter.TokenSecret; Console.WriteLine("OAuth Access Token's Secret: " + accessTokenSecret);
Lưu ý: Nếu bạn đang sử dụng HMAC-SHA1, hãy nhớ lưu thông tin bí mật của mã thông báo truy cập cùng với giá trị mã thông báo trong cơ sở dữ liệu của bạn, nếu không, bạn sẽ không thể tái tạo đúng các tham số oauth để sử dụng sau này.
Sử dụng mã truy cập
Sau khi bạn lấy được mã truy cập, hãy dùng các lệnh gọi tiêu chuẩn của thư viện ứng dụng Google Data APIs để tương tác với dịch vụ. Thư viện sẽ lo việc ký các yêu cầu và đưa tiêu đề Uỷ quyền chính xác vào cho bạn. Thông thường, bạn sẽ thu hồi mã thông báo của người dùng từ cookie hoặc cơ sở dữ liệu. Các ví dụ này minh hoạ cách tạo lại các tham số oauth và thực hiện lệnh gọi thư viện ứng dụng.
Java
Nếu bạn đang sử dụng HMAC-SHA1:
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setOAuthToken(ACCESS_TOKEN); oauthParameters.setOAuthTokenSecret(TOKEN_SECRET); DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full"); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
Điểm khác biệt với RSA-SHA1 là bạn không cần đặt bí mật của mã truy cập và cách tạo đối tượng trình ký cũng khác:
GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); oauthParameters.setOAuthToken(ACCESS_TOKEN); PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8"); // See above for the defintion of getPrivateKey() DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthRsaSha1Signer(privKey)); URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full"); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
PHP
require_once 'Zend/Gdata/Docs.php'; if (isset($_SESSION['ACCESS_TOKEN'])) { $accessToken = unserialize($_SESSION['ACCESS_TOKEN']); } else { exit; } /* Or, you could set an existing token (say one stored from your database). For HMAC-SHA1: $accessToken = new Zend_Oauth_Token_Access(); $accessToken->setToken('1/AQfoI-qJDqkvvkf216Gc2g'); $accessToken->setTokenSecret('2c26GLW250tZiQ'); */ $httpClient = $accessToken->getHttpClient($oauthOptions); $client = new Zend_Gdata_Docs($httpClient, "yourCompany-YourAppName-v1"); // Retrieve user's list of Google Docs $feed = $client->getDocumentListFeed(); foreach ($feed->entries as $entry) { echo "$entry->title\n"; }
Python
Đoạn mã này giả định rằng bạn đã tìm nạp mã truy cập (bằng cách sử dụng HMAC-SHA1) và đang gọi lại khoá/mã bí mật của mã thông báo đó để sử dụng sau này.
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
client = gdata.docs.client.DocsClient(source='yourCo-yourAppName-v1') client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY, CONSUMER_SECRET, TOKEN, TOKEN_SECRET, gdata.gauth.ACCESS_TOKEN) feed = client.GetDocList() for entry in feed.entry: print entry.title.text
Nếu bạn đang sử dụng các lớp v1.0 cũ dựa trên GDataService, hãy sử dụng:
client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET) # the token key and secret should be recalled from your database client.SetOAuthToken(gdata.auth.OAuthToken(key=TOKEN, secret=TOKEN_SECRET)) feed = client.GetDocumentListFeed() for entry in feed.entry: print entry.title.text
.NET
Nếu bạn đang sử dụng HMAC-SHA1:
OAuthParameters parameters = new OAuthParameters() {
ConsumerKey = CONSUMER_KEY,
ConsumerSecret = CONSUMER_SECRET,
Token = ACCESS_TOKEN,
TokenSecret = TOKEN_SECRET
}
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);
DocsService service = new DocsService(APPLICATION_NAME);
service.RequestFactory = requestFactory;
DocumentsListQuery query = new DocumentsListQuery();
DocumentsFeed feed = service.Query(query);
foreach (DocumentEntry entry in feed.Entries) {
Console.WriteLine(entry.Title.Text);
}Điểm khác biệt với RSA-SHA1 là bạn không cần đặt bí mật của mã truy cập và cách tạo đối tượng trình ký cũng khác:
RSA-SHA1 is not supported yet.
Các tài nguyên và mẫu khác về OAuth mạng-máy chủ-người dùng
- Ví dụ về OAuth trên Blog về các mẹo sử dụng Google Data API
- Bài viết: Sử dụng OAuth với Google Data API
- Mẫu thư viện ứng dụng Python
- Thư viện ứng dụng Python Mẫu Google App Engine
- Mẫu thư viện ứng dụng Java
- Thư viện ứng dụng Java Mẫu Google App Engine
- Mẫu thư viện ứng dụng Zend PHP
- Tài liệu Xác thực OAuth cho ứng dụng web
- Tài liệu về OAuth.net
OAuth 2 chân
OAuth 2 chân cho phép các ứng dụng đáng tin cậy truy cập vào Dữ liệu của người dùng trên Google mà không cần người dùng trực tiếp tham gia. Hai nhóm chính có thể sử dụng OAuth hai chân:
Quản trị viên miền G Suite: Quản trị viên có thể tạo tập lệnh và ứng dụng tuỳ chỉnh để quản lý dữ liệu người dùng cho miền của họ thông qua Google Data API. Để tìm hiểu về cách quản lý khoá và mã bí mật được liên kết với miền G Suite của bạn, cũng như cách cấp quyền kiểm soát truy cập toàn cầu, hãy xem phần "Quản lý khoá và mã bí mật OAuth".
Nhà cung cấp phần mềm bên thứ ba: Nhà cung cấp có thể cung cấp các ứng dụng sử dụng OAuth hai bước để tích hợp với G Suite. Bạn có thể cấp quyền truy cập cho các ứng dụng bên thứ ba trên trang Quản lý ứng dụng API hoặc bằng cách cài đặt từ G Suite Marketplace.
Bạn không cần mã truy cập theo quy trình uỷ quyền thông thường (còn được gọi là OAuth 3 chân).
Các mẫu thư viện ứng dụng sau đây minh hoạ cách thiết lập ứng dụng để sử dụng OAuth 2 chiều bằng HMAC-SHA1.
Java
import com.google.gdata.client.docs.*; import com.google.gdata.client.authn.oauth.*; String CONSUMER_KEY = "example.com"; String CONSUMER_SECRET = "abc123doremi"; GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters(); oauthParameters.setOAuthConsumerKey(CONSUMER_KEY); oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET); DocsService client = new DocsService("yourCompany-YourAppName-v1"); client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer()); // Retrieve user's list of Google Docs String user = "any.user@anydomain.com"; URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full" + "?xoauth_requestor_id=" + user); DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class); for (DocumentListEntry entry : resultFeed.getEntries()) { System.out.println(entry.getTitle().getPlainText()); }
PHP
require_once 'Zend/Oauth/Consumer.php'; require_once 'Zend/Gdata/Docs.php'; $CONSUMER_KEY = 'example.com'; $CONSUMER_SECRET = 'abc123doremi'; $USER = 'any.user@anydomain.com'; $oauthOptions = array( 'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER, 'version' => '1.0', 'signatureMethod' => 'HMAC-SHA1', 'consumerKey' => $CONSUMER_KEY, 'consumerSecret' => $CONSUMER_SECRET ); $consumer = new Zend_Oauth_Consumer($oauthOptions); $token = new Zend_Oauth_Token_Access(); $httpClient = $token->getHttpClient($oauthOptions); $client = new Zend_Gdata_Docs($httpClient); // Retrieve user's list of Google Docs $feed = $client->getDocumentListFeed('https://docs.google.com/feeds/default/private/full?xoauth_requestor_id=' . urlencode($USER)); foreach ($feed->entries as $entry) { echo "$entry->title\n"; }
Python
Nếu bạn đang sử dụng các lớp v2.0+ mới hơn dựa trên GDClient, hãy sử dụng:
import gdata.gauth import gdata.docs.client CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' requestor_id = 'any.user@anydomain.com' client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1') client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken( CONSUMER_KEY, CONSUMER_SECRET, requestor_id) # Retrieve user's list of Google Docs feed = client.GetDocList() for entry in feed.entry: print entry.title.text
Nếu bạn đang sử dụng các lớp v1.0 cũ dựa trên GDataService, hãy sử dụng:
import gdata.auth import gdata.docs.service CONSUMER_KEY = 'example.com' CONSUMER_SECRET = 'abc123doremi' SIG_METHOD = gdata.auth.OAuthSignatureMethod.HMAC_SHA1 requestor_id = 'any.user@anydomain.com' client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1') client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET, two_legged_oauth=True, requestor_id=requestor_id) # Retrieve user's list of Google Docs feed = client.GetDocumentListFeed() for entry in feed.entry: print entry.title.text # Change to another user on your domain client.GetOAuthInputParameters().requestor_id = 'another.user@example.com'
.NET
using Google.GData.Client; using Google.GData.Documents; // Create an OAuth factory to use GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", "yourCompany-YourAppName-v1"); requestFactory.ConsumerKey = "example.com"; requestFactory.ConsumerSecret = "abc123doremi"; String user = "any.user@anydomain.com"; DocumentsService client = new DocumentsService("yourCompany-YourAppName-v1"); client.RequestFactory = requestFactory; // Retrieve user's list of Google Docs DocumentsListQuery query = new DocumentsListQuery(); query.Uri = new OAuthUri("https://docs.google.com/feeds/default/private/full", user, requestFactory.ConsumerKey); DocumentsFeed feed = client.Query(query); foreach (DocumentEntry entry in feed.Entries) { Console.WriteLine(entry.Title.Text); }
Các tài nguyên và mẫu bổ sung về OAuth 2 chân
- Ví dụ về OAuth 2 chân trên Blog về các mẹo sử dụng Google Data API
- Thư viện ứng dụng Java Mẫu OAuth 2 chân
- Thư viện ứng dụng Python TwoLeggedOAuthExample (cho các lớp client.py) hoặc mẫu 2_legged_oauth (cho các lớp service.py)
- Thư viện ứng dụng .NET Mẫu OAuth 2 chân
- Tài liệu về OAuth 2 chân
Tạo khoá riêng tư tự ký và chứng chỉ công khai
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