OAuth ในไลบรารีของไคลเอ็นต์โปรโตคอลข้อมูลของ Google

คําเตือน: หน้านี้เกี่ยวกับ API แบบเก่าของ Google ซึ่งก็คือ Google Data API โดยเกี่ยวข้องกับ API ที่แสดงอยู่ในไดเรกทอรี Google Data API เท่านั้น โดยหลาย API ถูกแทนที่ด้วย API ที่ใหม่กว่า สําหรับข้อมูลเกี่ยวกับ API ใหม่โดยเฉพาะ โปรดดูเอกสารประกอบของ API ใหม่ ดูข้อมูลเกี่ยวกับการให้สิทธิ์คําขอด้วย API ใหม่ได้ที่การตรวจสอบสิทธิ์และการให้สิทธิ์บัญชี Google

เอกสารนี้อธิบายวิธีใช้ไลบรารีของไคลเอ็นต์ Google Data API เพื่อเชื่อมต่อกับการตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชันของ Google

อินเทอร์เฟซ OAuth ช่วยให้แอปพลิเคชันบนเว็บเข้าถึงบริการของ Google ในนามของผู้ใช้ได้ เพื่อรักษาความปลอดภัยระดับสูง OAuth จะช่วยให้แอปพลิเคชันรับโทเค็นเพื่อการเข้าถึงได้โดยไม่ต้องจัดการข้อมูลเข้าสู่ระบบบัญชีของผู้ใช้

ไลบรารีของไคลเอ็นต์ Google Data API มอบวิธีที่จะช่วยคุณใช้ OAuth ในเว็บแอปพลิเคชัน โดยเฉพาะอย่างยิ่ง มีวิธีสร้างโทเค็นคําขอ การให้สิทธิ์โทเค็นคําขอ และการแลกเปลี่ยนโทเค็นคําขอที่ได้รับอนุญาตสําหรับโทเค็นเพื่อการเข้าถึง ไลบรารียังจัดการอัลกอริทึมการลงนามที่จําเป็นเมื่อส่งคําขอไปยังบริการข้อมูลของ Google

ผู้ชม

เอกสารนี้มีไว้สําหรับโปรแกรมเมอร์ที่ต้องการแอปพลิเคชันบนเว็บเพื่อเข้าถึงบริการของ Google ในนามของผู้ใช้โดยใช้ไลบรารีของไคลเอ็นต์ Google Data API

เอกสารนี้จะถือว่าคุณคุ้นเคยกับอินเทอร์เฟซ OAuth และขั้นตอนทั่วไปสําหรับการรวม OAuth ในเว็บแอปพลิเคชัน ดูรายละเอียดโปรโตคอลทั้งหมดของ OAuth ได้ที่การตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชันหรือข้อกําหนดอย่างเป็นทางการที่ oauth.net

การใช้ OAuth แบบ 3 ทางและ Google Data API ที่ไม่มีไลบรารีของไคลเอ็นต์

หากต้องการให้เว็บแอปพลิเคชันโต้ตอบกับบริการข้อมูลของ Google โดยใช้ OAuth เป็นวิธีการให้สิทธิ์ สิ่งที่คุณต้องทราบมีดังต่อไปนี้การตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชัน ไม่จําเป็นต้องใช้ไลบรารีของไคลเอ็นต์ Google Data API หากไม่ต้องการ

ต่อไปนี้เป็นโครงร่างวิธีที่แอปพลิเคชันของคุณอาจตรวจสอบสิทธิ์ผู้ใช้โดยใช้ OAuth

  1. แอปพลิเคชันของคุณส่งคําขอที่ลงนามเพื่อดึงข้อมูลโทเค็นคําขอ OAuth เริ่มต้นจากปลายทาง OAuthRequestToken
  2. แอปพลิเคชันของคุณจะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL OAuthAuthorizeToken ที่เหมาะสมเพื่อให้สิทธิ์โทเค็นคําขอ
  3. เมื่อให้สิทธิ์เข้าถึง ระบบจะเปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชัน (URL oauth_callback)
  4. แอปพลิเคชันของคุณจะส่งคําขอที่ลงนามเพื่ออัปเกรดโทเค็นคําขอที่ได้รับอนุญาตเป็นโทเค็นเพื่อการเข้าถึงโดยใช้ปลายทาง OAuthGetAccessToken

ไลบรารีของไคลเอ็นต์ Google Data API ช่วยให้กระบวนการให้สิทธิ์นี้ง่ายขึ้นด้วยการจัดการรายละเอียดต่างๆ ให้คุณ เอกสารนี้อธิบายวิธีการ

กําลังลงทะเบียนเว็บแอปพลิเคชัน

OAuth จําเป็นต้องมีการเรียก API ทั้งหมดแบบดิจิทัล Google รองรับเมธอดลายเซ็น HMAC-SHA1 และ RSA-SHA1 แอปพลิเคชันต้องลงทะเบียนกับ Google เพื่อลงนามในคําขอ เมื่อคุณลงทะเบียนแล้ว Google จะให้คีย์ผู้บริโภค (และข้อมูลลับเพื่อใช้กับ HMAC-SHA1) และสถานที่สําหรับอัปโหลดใบรับรองสาธารณะ

1. การจดทะเบียนโดเมน

โปรดทําตามขั้นตอนที่ระบุไว้ในการลงทะเบียนสําหรับแอปพลิเคชันบนเว็บ

2. การสร้างคู่คีย์ส่วนตัว / ใบรับรองสาธารณะ (ไม่บังคับ)

หากเลือกใช้ RSA-SHA1 เป็น oauth_signature_method คุณจะต้องสร้างคู่คีย์ส่วนตัวและ RSA ที่มีการรับรองด้วยตนเอง ดูตัวอย่างวิธีการสร้างคีย์ส่วนตัวที่ลงนามด้วยตนเองและใบรับรองสาธารณะ (ด้านล่าง)

การทํางานกับ OAuth แบบ 3 ทางและ Google Data API: ตัวอย่างไลบรารีของไคลเอ็นต์

ส่วนต่อไปนี้แสดงตัวอย่างการใช้เมธอดไลบรารีของไคลเอ็นต์ Google API เพื่อทําตามขั้นตอนที่ระบุไว้ในส่วน "การทํางานกับ OAuth" ของเอกสารประกอบ OAuth ตัวอย่างทั้งหมดในเอกสารนี้จะถือว่าโดเมนโฮสต์ของแอปพลิเคชันของคุณคือ example.com

กําหนดขอบเขตของการเข้าถึงข้อมูล

บริการแต่ละรายการของ Google กําหนดค่า scope ที่กําหนดสิทธิ์เข้าถึงของโทเค็นสําหรับข้อมูลของผู้ใช้ ค่าขอบเขตที่ใช้ได้จะแสดงอยู่ในคําถามที่พบบ่อยเกี่ยวกับข้อมูลของ Google ตัวอย่างเช่น หากต้องการใช้ API รายชื่อเอกสาร ให้ตั้งค่า scope เป็น https://docs.google.com/feeds/ ตามที่ระบุไว้ในคําถามที่พบบ่อย

หมายเหตุ: ตั้งค่า scope เป็น URL ที่แคบที่สุดซึ่งอนุญาตให้เข้าถึงที่คุณต้องการ วิธีนี้จะช่วยลดโอกาสที่จะมีข้อมูลส่วนตัวรั่วไหล ตัวอย่างเช่น หากต้องการเข้าถึงฟีดรายการเอกสารส่วนตัวของผู้ใช้ปัจจุบัน ให้ใช้ขอบเขต https://docs.google.com/feeds/default/private/full แทนขอบเขตที่กว้างขึ้น เช่น https://docs.google.com/feeds/ ซึ่งให้สิทธิ์เข้าถึงฟีดรายการเอกสารทั้งหมด

โทเค็นที่มีหลายขอบเขต

หากต้องการสร้างโทเค็นที่เข้าถึง Google Data API หลายรายการ ให้แยกแต่ละขอบเขตด้วยอักขระเว้นวรรค ตัวอย่างด้านล่างจะสร้างโทเค็นที่มีสิทธิ์เข้าถึงทั้งข้อมูล Google เอกสารและ Google ปฏิทินของผู้ใช้

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
การเข้ารหัส URL

อักขระที่ไม่ใช่ ASCII ที่ปรากฏใน URL เช่น โคลอน เครื่องหมายทับ และเว้นวรรค ต้องเข้ารหัส URL จึงจะส่งผ่าน HTTP ได้ ไลบรารีของไคลเอ็นต์ Google Data API จะเข้ารหัสพารามิเตอร์ URL ให้คุณโดยอัตโนมัติ คุณจึงใช้สตริงที่ไม่เข้ารหัส URL ในการกําหนดค่าให้กับพารามิเตอร์ได้ ตัวอย่างเช่น คุณจะสร้างงานต่อไปนี้ในโค้ดได้

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/

เมื่อคุณเรียกไลบรารีของไคลเอ็นต์ ระบบจะเข้ารหัสพารามิเตอร์ scope เป็นค่า URL โดยอัตโนมัติด้วยค่าต่อไปนี้
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

กําลังดึงข้อมูลโทเค็นคําขอ

Java

สําหรับ HMAC-SHA1 คุณต้องหาวิธีกู้คืนข้อมูลลับของโทเค็น (ได้รับในการตอบกลับ) เพื่อสร้างออบเจ็กต์โทเค็น OAuth ที่กลับไปที่หน้าอนุมัติ โดยตั้งค่าตัวแปรเซสชันหรือคุกกี้

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);

เมื่อใช้ RSA-SHA1 อยู่ ระบบจะไม่ใช้ oauth_token_secret ดังนั้นจึงไม่จําเป็นต้องเก็บข้อมูลลับของโทเค็นไว้

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

การใช้ HMAC-SHA1 เป็นวิธีลายเซ็น

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))));
}

การใช้ RSA-SHA1 เป็นวิธีลายเซ็น

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

การใช้ HMAC-SHA1 เป็นวิธีลายเซ็น

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

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')

การใช้ RSA-SHA1 เป็นวิธีลายเซ็น

...

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)

หรือหากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService การเรียกอาจแตกต่างไปเล็กน้อย

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)

การใช้ RSA-SHA1 เป็นวิธีลายเซ็น

...

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

การใช้ HMAC-SHA1 เป็นวิธีลายเซ็น

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);

การใช้ RSA-SHA1 เป็นวิธีลายเซ็น

RSA-SHA1 is not supported yet.

การให้สิทธิ์โทเค็นคําขอ

หากต้องการให้สิทธิ์โทเค็นคําขอ แอปพลิเคชันต้องเปลี่ยนเส้นทางผู้ใช้ไปยัง URL ของ OAuthAuthorizeToken ซึ่งจะแจ้งให้เข้าสู่ระบบบัญชี Google ดูข้อมูลเพิ่มเติมเกี่ยวกับ URL ของ OAuthAuthorizeToken ได้ที่การตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชันฉบับเต็ม

หากต้องการสร้าง URL OAuthAuthorizeToken ในแอปพลิเคชัน ให้ใช้ค่าต่อไปนี้สําหรับไลบรารีของไคลเอ็นต์แต่ละรายการ โปรดทราบว่าตัวอย่างเหล่านี้สร้างขึ้นจากตัวอย่างก่อนหน้า

หลังจากที่สร้าง URL ของหน้าการอนุมัติแล้ว แอปพลิเคชันของคุณจะสามารถใช้ URL นี้เพื่อส่งผู้ใช้ไปยังเครื่องจัดการ OAuthAuthorizeToken ได้หลายวิธี วิธีที่ใช้บ่อยที่สุดคือการเปลี่ยนเส้นทางผู้ใช้หรือแสดงลิงก์ไปยังหน้าดังกล่าว

Java

สําหรับ HMAC-SHA1:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

สําหรับ 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>";

หรือคุณอาจเปลี่ยนเส้นทางไปยัง URL ที่อนุมัติ โดยทําดังนี้

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$consumer->redirect(array('hd' => 'default'));

Python

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

# 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))

หากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService กระบวนการอาจแตกต่างออกไปเล็กน้อย

# 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);

การแยกโทเค็นจาก URL เรียกกลับ

เมื่อ Google เปลี่ยนเส้นทางกลับไปที่แอปพลิเคชันของคุณ oauth_token จะต่อท้าย URL "oauth_callback_url" เป็นพารามิเตอร์การค้นหา จากนั้นแอปพลิเคชันควรดึงค่าโทเค็นจากพารามิเตอร์การค้นหา URL แล้วสร้างพารามิเตอร์ OAuth อีกครั้ง

ไลบรารีของไคลเอ็นต์มีวิธีที่สะดวกสําหรับการแยก oauth_token ตัวอย่างเหล่านี้สร้างขึ้นจากตัวอย่างก่อนหน้า

Java

หากคุณเลือกที่จะเก็บรักษาข้อมูลลับของโทเค็นใน URL โค้ดเรียกกลับ (เมื่อใช้ 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);

ความแตกต่างเพียงอย่างเดียวของ RSA-SHA1 คือวิธีการลงนาม

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

ขั้นตอนนี้ไม่จําเป็นเมื่อใช้ไลบรารี PHP

Python

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

# 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)

หากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService ให้ใช้

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'

กระบวนการจะคล้ายกับ RSA-SHA1 แต่ไม่มีรหัสลับโทเค็น ดังนี้

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

หากคุณเลือกที่จะเก็บรักษาข้อมูลลับของโทเค็นใน URL โค้ดเรียกกลับ ให้ทําดังนี้

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

อัปเกรดเป็นโทเค็นเพื่อการเข้าถึง

ขั้นตอนสุดท้ายในการเต้นโทเค็น OAuth คือการอัปเกรดโทเค็นคําขอที่ได้รับอนุญาตเป็นโทเค็นเพื่อการเข้าถึงที่ใช้ได้นานโดยใช้ URL OAuthGetAccessToken ตามที่อธิบายไว้ในเอกสารประกอบเรื่องการตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชันฉบับเต็ม

ตัวอย่างการใช้ไลบรารีของไคลเอ็นต์แต่ละรายการมีดังนี้

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

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

# 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)

หากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService ให้ใช้

access_token = client.UpgradeToOAuthAccessToken()  # calls SetOAuthToken() for you

หากคุณใช้ gdata.gauth.AeSave() ใน App Engine ระบบจะเก็บโทเค็นและข้อมูลลับของโทเค็นไว้ภายใต้ผู้ใช้ที่เข้าสู่ระบบในปัจจุบัน

.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);

หมายเหตุ: หากคุณใช้ HMAC-SHA1 อย่าลืมบันทึกข้อมูลลับของโทเค็นเพื่อการเข้าถึงพร้อมกับค่าโทเค็นในฐานข้อมูล ไม่เช่นนั้นคุณจะสร้างพารามิเตอร์ OAuth อีกครั้งอย่างถูกต้องเพื่อนําไปใช้ในภายหลังไม่ได้

การใช้โทเค็นเพื่อการเข้าถึง

เมื่อได้รับโทเค็นเพื่อการเข้าถึงแล้ว ให้ใช้การเรียกไลบรารีของไคลเอ็นต์ Google Data API มาตรฐานเพื่อโต้ตอบกับบริการ ไลบรารีจะดูแลลายเซ็นของคําขอและใส่ส่วนหัว Authorization ที่ถูกต้องให้กับคุณ โดยทั่วไป คุณจะเรียกคืนโทเค็นของผู้ใช้จากคุกกี้หรือฐานข้อมูลได้ ตัวอย่างเหล่านี้สาธิตวิธีการสร้างพารามิเตอร์ OAuth อีกครั้งและเรียกไลบรารีของไคลเอ็นต์

Java

หากใช้ 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());
  }
  

ความแตกต่างกับ RSA-SHA1 คือคุณไม่จําเป็นต้องตั้งค่าข้อมูลลับของโทเค็นเพื่อการเข้าถึงและการสร้างออบเจ็กต์ผู้ลงนามจะแตกต่างกันดังนี้

  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

ข้อมูลโค้ดนี้จะถือว่าคุณได้ดึงข้อมูลโทเค็นเพื่อการเข้าถึงแล้ว (โดยใช้ HMAC-SHA1) และเรียกคืนคีย์/โทเค็นนั้นเพื่อใช้ในภายหลัง

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

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

หากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService ให้ใช้

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

หากใช้ 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);
}

ความแตกต่างกับ RSA-SHA1 คือคุณไม่จําเป็นต้องตั้งค่าข้อมูลลับของโทเค็นเพื่อการเข้าถึงและการสร้างออบเจ็กต์ผู้ลงนามจะแตกต่างกันดังนี้

RSA-SHA1 is not supported yet.

ทรัพยากรและตัวอย่าง OAuth แบบ 3 ทางเพิ่มเติม

กลับไปด้านบน

OAuth แบบ 2 ทาง

OAuth แบบ 2 ทางช่วยให้แอปพลิเคชันที่เชื่อถือได้เข้าถึงข้อมูล Google ของผู้ใช้ได้โดยไม่ต้องใช้โดยตรง กลุ่มสําคัญ 2 กลุ่มสามารถใช้ OAuth แบบ 2 ทางได้

ผู้ดูแลระบบโดเมน G Suite: ผู้ดูแลระบบสามารถสร้างสคริปต์และแอปพลิเคชันที่กําหนดเองที่จัดการข้อมูลผู้ใช้สําหรับโดเมนผ่าน Google Data API ได้ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการจัดการคีย์และข้อมูลลับที่เชื่อมโยงกับโดเมน G Suite และการให้สิทธิ์การเข้าถึงส่วนกลาง โปรดดู "การจัดการคีย์และข้อมูลลับของ OAuth"

ผู้ให้บริการซอฟต์แวร์บุคคลที่สาม: ผู้ให้บริการอาจเสนอแอปพลิเคชันที่ใช้ OAuth แบบ 2 ทางเพื่อผสานรวมกับ G Suite คุณสามารถให้สิทธิ์แอปพลิเคชันของบุคคลที่สามได้ในหน้าจัดการ API ไคลเอ็นต์หรือจาก G Suite Marketplace

ไม่จําเป็นต้องใช้โทเค็นเพื่อการเข้าถึงตามขั้นตอนการให้สิทธิ์ปกติ (หรือที่เรียกว่า OAuth แบบ 3 ทาง)

ตัวอย่างไลบรารีของไคลเอ็นต์ต่อไปนี้จะแสดงวิธีตั้งค่าไคลเอ็นต์ให้ใช้ OAuth แบบ 2 ทางโดยใช้ 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

หากคุณใช้คลาส v2.0+ เวอร์ชันใหม่ที่อิงตาม GDClient ให้ใช้สิ่งต่อไปนี้

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

หากคุณใช้คลาส v1.0 แบบเก่าตาม GDataService ให้ใช้

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);
}

ทรัพยากรและตัวอย่าง OAuth แบบ 2 ทางเพิ่มเติม

การสร้างคีย์ส่วนตัวที่ลงนามด้วยตนเองและใบรับรองสาธารณะ

คีย์ส่วนตัวจะใช้ในการสร้างลายเซ็น ซึ่งต้องรวมอยู่ในคําขอแต่ละรายการ Google จะใช้คีย์สาธารณะที่ฝังอยู่ในใบรับรองเพื่อยืนยันลายเซ็น คีย์สาธารณะต้องเป็นคีย์ RSA แบบ 1024 บิตที่เข้ารหัสในใบรับรอง X.509 ในรูปแบบ PEM คุณควรส่งใบรับรองไปยัง Google ในขณะที่ลงทะเบียน

ส่วนต่อไปนี้จะมีตัวอย่างวิธีสร้างคีย์และใบรับรองโดยใช้เครื่องมือ 2 อย่าง ได้แก่ ยูทิลิตี OpenSSL และยูทิลิตี keytool ของ Java

ตัวอย่างเหล่านี้ไม่ได้เจาะจงสําหรับ Google Data API คุณสามารถใช้ยูทิลิตีเดียวกันเพื่อสร้างคีย์เพื่อวัตถุประสงค์ใดๆ

ตัวอย่างจะถือว่าบริษัทของคุณมีชื่อว่า My_Company และตั้งอยู่ในเมาน์เทนวิว รัฐแคลิฟอร์เนีย สหรัฐอเมริกา โดยมีชื่อโดเมน example.com

การสร้างคีย์โดยใช้ OpenSSL

หากต้องการสร้างคีย์ RSA 1 คู่และใบรับรองที่เกี่ยวข้อง 1 รายการ ให้ใช้คําสั่งต่อไปนี้

# 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

คําเตือน: การใส่พารามิเตอร์ -nodes จะสร้างคีย์ส่วนตัวโดยไม่มีรหัสผ่านเพื่อปกป้องคีย์ อย่างไรก็ตาม คุณไม่ควรใส่พารามิเตอร์นี้เพื่อเพิ่มความปลอดภัย

พารามิเตอร์ -sha1 ระบุว่าจะมีการใช้คีย์เพื่อสร้างลายเซ็น SHA1

พารามิเตอร์ -subj ระบุข้อมูลประจําตัวของแอปพลิเคชันที่ใบรับรองแสดง

พารามิเตอร์ -keyout จะระบุไฟล์ซึ่งประกอบด้วยคีย์ ไฟล์นี้มีข้อมูลที่ละเอียดอ่อน และควรได้รับการคุ้มครองและไม่มีการแชร์กับผู้อื่น

พารามิเตอร์ -out จะระบุไฟล์ที่มีใบรับรองในรูปแบบ PEM (ซึ่งส่งไปยัง Google ได้ขณะลงทะเบียน)

กําลังสร้างคีย์สําหรับไคลเอ็นต์ .NET

เฟรมเวิร์ก .NET ไม่เข้าใจคีย์หรือใบรับรองที่จัดเก็บไว้ในรูปแบบ PEM คุณจึงต้องทําตามขั้นตอนเพิ่มเติมเมื่อสร้างไฟล์ .pem แล้ว

openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"

ขั้นตอนนี้จะสร้างไฟล์ PFX จากคีย์ส่วนตัวและใบรับรองของคุณ ไฟล์นี้สามารถนําเข้าไปยังไลบรารีของไคลเอ็นต์ .NET เพื่อลงนามคําขอแบบดิจิทัลไปยัง Google Data API ได้

กําลังสร้างคีย์สําหรับไคลเอ็นต์ Java

ไคลเอ็นต์ Java ยอมรับคีย์ส่วนตัวในรูปแบบ PKCS#8 หลังจากสร้างคีย์/ใบรับรองโดยใช้คําแนะนําด้านบน ให้สร้างไฟล์ .pk8 จากไฟล์ .pem ที่คุณสร้าง

openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8

หรือคุณจะใช้ Java Key Store และยูทิลิตีเครื่องมือคีย์เพื่อสร้างคีย์ RSA 1 คู่และใบรับรองที่เกี่ยวข้อง ใช้คําสั่งต่อไปนี้

# 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

คําเตือน: "changeme" ไม่ใช่รหัสผ่านที่ดี นี่เป็นเพียงตัวอย่างเท่านั้น

พารามิเตอร์ -dname ระบุข้อมูลประจําตัวของแอปพลิเคชันที่ใบรับรองแสดง พารามิเตอร์ -storepass ระบุรหัสผ่านเพื่อปกป้องคีย์สโตร์ พารามิเตอร์ -keypass ระบุรหัสผ่านเพื่อปกป้องคีย์ส่วนตัว

หากต้องการเขียนใบรับรองลงในไฟล์ที่ใช้ได้ในเครื่องมือ ManageDomains ให้ใช้คําสั่งต่อไปนี้

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

กลับไปด้านบน