OAuth trong Thư viện ứng dụng Giao thức dữ liệu của Google

Cảnh báo: Trang này giới thiệu về các API cũ của Google, API dữ liệu của Google; trang này chỉ liên quan đến các API được liệt kê trong thư mục API dữ liệu của Google, nhiều API trong số này đã đượ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 của API mới. Để biết thông tin về việc 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à ủy quyền tài khoản Google.

Tài liệu này mô tả cách sử dụng thư viện ứng dụng API Dữ liệu của Google để 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 ứng dụng dựa trên nền tảng web truy cập vào dịch vụ của Google thay mặt 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 dùng OAuth trong ứng dụng web. 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. Thư viện cũng xử lý các thuật toán ký cần thiết khi gửi yêu cầu đến một dịch vụ Dữ liệu của Google.

Đối tượng người xem

Tài liệu này dành cho những lập trình viên muốn các ứng dụng dựa trên nền tảng web của họ truy cập vào các dịch vụ của Google thay mặt người dùng bằng cách sử dụng thư viện ứng dụng API của Google Data.

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. Để xem nội dung mô tả đầy đủ về giao thức của OAuth, hãy xem phần Xác thực OAuth cho ứng dụng web hoặc thông số kỹ thuật chính thức tại OAuth.net.

Sử dụng OAuth và API dữ liệu Google 3 chân mà không có 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 OAuth làm phương thức uỷ quyền, thì bạn cần biết mọi thứ bạn cần 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.

Dưới đây là bản tóm tắt về cách ứng dụng của bạn có thể xác thực người dùng bằng OAuth:

  1. Ứng dụng tạo 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.
  2. Ứng dụng của bạn chuyển hướng người dùng đến URL OAuthAuthorizeToken thích hợp để cho phép mã thông báo yêu cầu.
  3. Sau khi 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)
  4. Ứ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 lên mã thông báo truy cập bằng điểm cuối OAuthGetAccessToken.

Thư viện ứng dụng API Dữ liệu của Google đơn giản hoá quy trình cấp phép này bằng cách xử lý nhiều 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 của bạn

OAuth yêu cầu tất cả lệnh gọi API phải có chữ ký số. Google hỗ trợ các phương thức chữ ký HMAC-SHA1RSA-SHA1. Để ký yêu cầu, trước tiên, ứng dụng của bạn cần đăng ký với Google. Sau khi bạn đăng ký, Google sẽ cung cấp cho bạn khoá dành cho người dùng (và bí mật để sử dụng với HMAC-SHA1), đồng thời là nơi để tải chứng chỉ công khai lên.

1. Đăng ký miền của bạn

Vui lòng làm theo các bước đã nêu trong phần Đăng ký các ứ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 sẽ cần tạo một cặp khoá riêng tư RSA và cặp chứng chỉ công khai tự ký. 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 việc này.

Làm việc với OAuth 3 bên và API Dữ liệu của Google: ví dụ về thư viện ứng dụng

Các phần sau đây cho thấy ví dụ về cách sử dụng các phương thức thư viện ứng dụng API của Google Data để làm theo 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 máy chủ 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 của bạn

Mỗi dịch vụ của Google đều 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ó sẵn đượ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 API Danh sách tài liệu, hãy đặt scope thành https://docs.google.com/feeds/, như liệt kê trong Câu hỏi thường gặp.

Lưu ý: Hãy đặt giá trị scope thành URL hẹp nhất cho phép truy cập theo yêu cầu. Điều này giúp giảm nguy cơ vô tình thu thập và 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/, việc này cung cấp quyền truy cập vào tất cả các nguồn cấp dữ liệu Danh sách tài liệu.

Mã thông báo đa phạm vi

Để tạo mã truy cập truy cập nhiều API dữ liệu của Google, hãy phân tách từng phạm vi bằng một ký tự dấu cách. Ví dụ dưới đây sẽ tạo một mã thông báo có quyền truy cập vào cả dữ liệu của người dùng trên Google Tài liệu và dữ liệu Lịch Google.

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ó thể truyền qua HTTP. Thư viện ứng dụng Google Data API tự động mã hoá các tham số URL cho bạn, vì vậy bạn có thể chỉ cần dùng các chuỗi không được mã hoá URL khi chỉ định giá trị cho tham số. Ví dụ: bạn có thể thực hiện bài tập 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 một số cách để lưu trữ mã thông báo bí mật (đã nhận được trong phản hồi) để tạo đối tượng mã thông báo OAuth quay lại từ trang phê duyệt. Để làm việc đó, hãy đặt một biến hoặc phiên hoạt động của phiên.

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 sử dụng RSA-SHA1, oauth_token_secret không được sử dụng nên bạn không cần phải giữ bí mật về mã thông báo.

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 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 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 ký:

Nếu bạn đang sử dụng các lớp mới hơn phiên bản 2.0 trở lê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 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 sử dụng các lớp phiên bản 1.0 cũ hơn 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 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 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 ký:

RSA-SHA1 is not supported yet.

Cấp phép mã thông báo yêu cầu

Để cho phép mã thông báo yêu cầu, ứng dụng phải chuyển hướng người dùng đến URL OAuthAuthorizeToken. Thao tác này sẽ nhắc họ đăng nhập vào Tài khoản Google. Để biết thêm thông tin về URL OAuthAuthorizeToken, hãy xem phần Xác thực OAuth đầy đủ cho các ứng dụng web.

Để tạo URL OAuthAuthorizeToken trong ứng dụng, hãy sử dụng URL sau cho từng thư viện ứng dụng. Xin lưu ý rằng các mẫu này dựa trên các ví dụ trước.

Sau khi tạo URL trang phê duyệt, ứng dụng có thể sử dụng URL đó theo nhiều cách để đưa người dùng đến trình xử lý OAuthAuthorizeToken. Phương pháp 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 chỉ cần chuyển hướng đến URL phê duyệt như sau:

// 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 mới hơn phiên bản 2.0 trở lê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 phiên bản 1.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 được nối vào URL "oauth_callback_url" dưới dạng 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.

Thư viện ứng dụng cung cấp các phương thức thuận tiện để 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 lưu trữ mã thông báo bí mật trong URL gọi lại (khi sử 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ước này không cần thiết khi sử dụng thư viện PHP.

Python

Nếu bạn đang sử dụng các lớp mới hơn phiên bản 2.0 trở lê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 phiên bản 1.0 cũ hơn 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'

Quá trình này tương tự như RSA-SHA1, nhưng không có mã thông báo bí mật:

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 lưu trữ mã thông báo bí mật trong URL 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 phương thức nhảy mã thông báo OAuth là nâng cấp mã thông báo yêu cầu được uỷ quyền lên mã thông báo truy cập dài hạn bằng cách sử dụng URL OAuthGetAccessToken, như được mô tả trong tài liệu đầy đủ về Xác thực OAuth cho ứng dụng web.

Dưới đây là một số ví dụ về cách 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 mới hơn phiên bản 2.0 trở lê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 phiên bản 1.0 cũ hơn 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à mã thông báo bí mật sẽ được lưu trữ cho bạn trong người dùng hiện đã đă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 sử dụng HMAC-SHA1, hãy nhớ lưu mã thông báo 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. Nếu không, bạn sẽ không thể tạo lại thông số OAuth để sử dụng sau này.

Sử dụng mã truy cập

Sau khi bạn nhận được mã truy cập, hãy sử dụng lệnh gọi thư viện ứng dụng Google Data API tiêu chuẩn để tương tác với dịch vụ. Thư viện sẽ xử lý việc ký các yêu cầu và bao gồm tiêu đề Uỷ quyền chính xác cho bạn. Thông thường, bạn sẽ nhớ lại mã thông báo của người dùng từ cookie hoặc cơ sở dữ liệu. Những ví dụ này minh họa cách tạo lại thông 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());
  }
  

Sự khác biệt với RSA-SHA1 là bạn không cần đặt mã thông báo truy cập và cách tạo đối tượng chữ ký khác nhau:

  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ã thông báo truy cập (sử dụng HMAC-SHA1) và đang thu hồi khoá/mã bí mật đó để sử dụng sau này.

Nếu bạn đang sử dụng các lớp mới hơn phiên bản 2.0 trở lê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 phiên bản 1.0 cũ hơn 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);
}

Sự khác biệt với RSA-SHA1 là bạn không cần đặt mã thông báo truy cập và cách tạo đối tượng chữ ký khác nhau:

RSA-SHA1 is not supported yet.

Tài nguyên và mẫu OAuth 3 giai đoạn bổ sung

Trở lại đầu trang

OAuth 2 đã đóng

OAuth chân cho phép các ứng dụng đáng tin cậy truy cập dữ liệu của người dùng trên Google mà không cần trực tiếp tham gia. Hai nhóm chính có thể sử dụng OAuth hai bê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 tùy chỉnh quản lý dữ liệu người dùng cho miền của họ thông qua các API dữ liệu của Google. Để tìm hiểu về cách quản lý khoá và bí mật được liên kết với miền G Suite của bạn, đồng thời cấp quyền kiểm soát truy cập toàn cầu, hãy xem "Quản lý khoá và 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ên để 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 của 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.

Mã thông báo truy cập là không bắt buộc theo quy trình uỷ quyền thông thường (còn gọi là OAuth mạng-máy chủ-người dùng).

Các mẫu thư viện ứng dụng sau đây minh hoạ cách thiết lập ứng dụng của bạn để sử dụng 2 thiết bị OAuth thông qua 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 mới hơn phiên bản 2.0 trở lê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 phiên bản 1.0 cũ hơn 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);
}

Tài nguyên và mẫu OAuth 2 giai đoạn bổ sung

Tạo khoá riêng tư và chứng chỉ công khai tự ký

Khoá riêng tư này dùng để tạo chữ ký và phải có trong mỗi yêu cầu. Google sẽ sử 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á theo chứng chỉ X.509 ở định dạng PEM. Bạn phải gửi giấy chứng nhận 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.

Các ví dụ này không dành riêng cho API Dữ liệu của Google; bạn có thể sử dụng cùng các tiện ích để tạo khoá cho bất kỳ mục đích nào.

Các ví dụ giả định rằng công ty của bạn có tên là My_Company và nằm ở Mountain View, California, Hoa Kỳ, với tên miền example.com.

Tạo khóa 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 bao gồm thông số -nodes sẽ tạo ra 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 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à phải được bảo vệ, không 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ý).

Đang tạo khoá cho ứng dụng .NET

Khung .NET không hiểu được 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 nữa 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. Tệp này có thể được nhập vào thư viện ứng dụng .NET để ký các yêu cầu kỹ thuật số bằng API dữ liệu của Google.

Đang tạo khoá cho ứng dụng Java

Ứng dụng Java chấp nhận các khoá riêng tư ở định dạng PKCS#8. Sau khi tạo khóa/chứng chỉ theo hướng dẫn ở trên, hãy tạo tệp .pk8 từ tệp .pem 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 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 tệp có thể dùng trong công cụ ManageDomains, hãy sử 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

Trở lại đầu trang