คําเตือน: หน้านี้เกี่ยวกับ 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
- แอปพลิเคชันของคุณส่งคําขอที่ลงนามเพื่อดึงข้อมูลโทเค็นคําขอ OAuth เริ่มต้นจากปลายทาง
OAuthRequestToken
- แอปพลิเคชันของคุณจะเปลี่ยนเส้นทางผู้ใช้ไปยัง URL
OAuthAuthorizeToken
ที่เหมาะสมเพื่อให้สิทธิ์โทเค็นคําขอ - เมื่อให้สิทธิ์เข้าถึง ระบบจะเปลี่ยนเส้นทางผู้ใช้กลับไปยังแอปพลิเคชัน (URL
oauth_callback
) - แอปพลิเคชันของคุณจะส่งคําขอที่ลงนามเพื่ออัปเกรดโทเค็นคําขอที่ได้รับอนุญาตเป็นโทเค็นเพื่อการเข้าถึงโดยใช้ปลายทาง
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 ในบล็อกเคล็ดลับเกี่ยวกับ Google Data API
- บทความ: การใช้ OAuth กับ Google Data API
- ตัวอย่างไลบรารีของไคลเอ็นต์ Python
- ไลบรารีของไคลเอ็นต์ Python ตัวอย่าง Google App Engine
- ตัวอย่างไลบรารีของไคลเอ็นต์ Java
- ไลบรารีของไคลเอ็นต์ Java ตัวอย่าง Google App Engine
- ตัวอย่างไลบรารีของไคลเอ็นต์ Zend PHP ตัวอย่าง
- เอกสารประกอบการตรวจสอบสิทธิ์ OAuth สําหรับเว็บแอปพลิเคชัน
- เอกสารประกอบเกี่ยวกับ OAuth.net
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 ทางเพิ่มเติม
- ตัวอย่าง OAuth แบบ 2 ทางในบล็อกเคล็ดลับเกี่ยวกับ Google Data API
- ไลบรารีของไคลเอ็นต์ Java ตัวอย่าง OAuth แบบ 2 ทาง
- ไลบรารีของไคลเอ็นต์ Python TWOLeggedOAuthExample (สําหรับคลาส client.py) หรือตัวอย่าง 2_legging_oauth (สําหรับคลาส service.py)
- ไลบรารีของไคลเอ็นต์ .NET ตัวอย่าง OAuth แบบ 2 ทาง
- เอกสาร 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