Google Data Protocol Client Libraries में OAuth

चेतावनी: यह पेज, Google के पुराने एपीआई, Google Data API के बारे में है. यह सिर्फ़ उन एपीआई के लिए काम का है जो Google Data API डायरेक्ट्री में शामिल हैं. इनमें से कई एपीआई को नए एपीआई से बदल दिया गया है. किसी नए एपीआई के बारे में जानकारी पाने के लिए, उस एपीआई का दस्तावेज़ देखें. नए एपीआई की मदद से अनुरोधों को अनुमति देने के बारे में जानकारी पाने के लिए, Google खातों के लिए पुष्टि करने और अनुमति देने की सुविधा लेख पढ़ें.

इस दस्तावेज़ में, Google Data API की क्लाइंट लाइब्रेरी का इस्तेमाल करके, Google के वेब ऐप्लिकेशन के लिए OAuth ऑथेंटिकेशन से कनेक्ट करने का तरीका बताया गया है.

OAuth इंटरफ़ेस की मदद से, वेब पर काम करने वाला कोई ऐप्लिकेशन, उपयोगकर्ता की ओर से Google की किसी सेवा को ऐक्सेस कर सकता है. OAuth, सुरक्षा के बेहतर स्तर को बनाए रखने के लिए, ऐप्लिकेशन को ऐक्सेस टोकन पाने की सुविधा देता है. हालांकि, इस दौरान उपयोगकर्ता के खाते में लॉगिन करने की जानकारी को कभी भी हैंडल नहीं किया जाता.

Google Data API की क्लाइंट लाइब्रेरी, आपके वेब ऐप्लिकेशन में OAuth का इस्तेमाल करने के तरीके बताती हैं. खास तौर पर, अनुरोध टोकन पाने, अनुरोध टोकन को अनुमति देने, और अनुमति वाले अनुरोध टोकन को ऐक्सेस टोकन के लिए बदलने के तरीके हैं. Google की डेटा सेवा से अनुरोध करते समय, ये लाइब्रेरी ज़रूरी हस्ताक्षर एल्गोरिदम को भी मैनेज करती हैं.

ऑडियंस

यह दस्तावेज़ उन प्रोग्रामर के लिए है जो अपने वेब ऐप्लिकेशन को, उपयोगकर्ताओं की ओर से Google की सेवाओं को ऐक्सेस करने की अनुमति देना चाहते हैं. इसके लिए, उन्हें Google Data APIs की क्लाइंट लाइब्रेरी का इस्तेमाल करना होगा.

इस दस्तावेज़ में यह माना गया है कि आपको OAuth इंटरफ़ेस और अपने वेब ऐप्लिकेशन में OAuth को शामिल करने की सामान्य प्रोसेस के बारे में पता है. OAuth के प्रोटोकॉल के बारे में पूरी जानकारी के लिए, वेब ऐप्लिकेशन के लिए OAuth ऑथेंटिकेशन देखें. इसके अलावा, oauth.net पर जाकर, आधिकारिक स्पेसिफ़िकेशन देखें.

क्लाइंट लाइब्रेरी के बिना, तीन लेग वाले OAuth और Google Data API का इस्तेमाल करना

अगर आपको अपने वेब ऐप्लिकेशन को Google की डेटा सेवा के साथ इंटरैक्ट करने की अनुमति देनी है, तो इसके लिए OAuth को अनुमति देने के तरीके के तौर पर इस्तेमाल करें. इसके बारे में पूरी जानकारी वेब ऐप्लिकेशन के लिए OAuth ऑथेंटिकेशन में दी गई है. अगर आपको Google Data APIs की क्लाइंट लाइब्रेरी का इस्तेमाल नहीं करना है, तो ऐसा करना ज़रूरी नहीं है.

यहां बताया गया है कि आपका ऐप्लिकेशन, OAuth का इस्तेमाल करके किसी उपयोगकर्ता की पुष्टि कैसे कर सकता है:

  1. आपका ऐप्लिकेशन, OAuthRequestToken एंडपॉइंट से शुरुआती OAuth अनुरोध टोकन पाने के लिए, हस्ताक्षर किया गया अनुरोध करता है.
  2. आपका ऐप्लिकेशन, उपयोगकर्ता को सही OAuthAuthorizeToken यूआरएल पर रीडायरेक्ट करता है, ताकि अनुरोध टोकन को अनुमति दी जा सके.
  3. ऐक्सेस देने के बाद, उपयोगकर्ता को आपके ऐप्लिकेशन (oauth_callback यूआरएल) पर वापस रीडायरेक्ट कर दिया जाता है
  4. आपका ऐप्लिकेशन, OAuthGetAccessToken एंडपॉइंट का इस्तेमाल करके, अनुमति वाले अनुरोध टोकन को ऐक्सेस टोकन में अपग्रेड करने के लिए, हस्ताक्षर किया गया अनुरोध भेजता है.

Google Data APIs की क्लाइंट लाइब्रेरी, अनुमति देने की इस प्रोसेस को आसान बनाती हैं. ये लाइब्रेरी, आपके लिए कई तरह की जानकारी मैनेज करती हैं. इस दस्तावेज़ में इसका तरीका बताया गया है.

वेब ऐप्लिकेशन रजिस्टर करना

OAuth के लिए, यह ज़रूरी है कि सभी एपीआई कॉल पर डिजिटल रूप से हस्ताक्षर किए गए हों. Google, HMAC-SHA1 और RSA-SHA1 सिग्नेचर के तरीकों के साथ काम करता है. अनुरोधों पर हस्ताक्षर करने के लिए, आपके ऐप्लिकेशन को सबसे पहले Google के साथ रजिस्टर करना होगा. रजिस्टर करने के बाद, Google आपको उपभोक्ता कुंजी (और HMAC-SHA1 के साथ इस्तेमाल करने के लिए सीक्रेट) देगा. साथ ही, सार्वजनिक सर्टिफ़िकेट अपलोड करने की जगह भी देगा.

1. डोमेन रजिस्टर करना

कृपया वेब पर आधारित ऐप्लिकेशन के लिए रजिस्ट्रेशन में बताया गया तरीका अपनाएं.

2. निजी पासकोड / सार्वजनिक सर्टिफ़िकेट का जोड़ा बनाना (ज़रूरी नहीं)

अगर आपको RSA-SHA1 को oauth_signature_method के तौर पर इस्तेमाल करना है, तो आपको खुद के हस्ताक्षर वाली RSA निजी कुंजी और सार्वजनिक सर्टिफ़िकेट का एक जोड़ा बनाना होगा. इसे करने के तरीके के उदाहरणों के लिए, सेल्फ़-साइनिंग वाली निजी कुंजी और सार्वजनिक सर्टिफ़िकेट जनरेट करना (नीचे) देखें.

तीन लेग वाले OAuth और Google Data API के साथ काम करना: क्लाइंट लाइब्रेरी के उदाहरण

नीचे दिए गए सेक्शन में, Google Data APIs की क्लाइंट लाइब्रेरी के तरीकों का इस्तेमाल करके, OAuth के दस्तावेज़ के "OAuth का इस्तेमाल करना" सेक्शन में बताए गए चरणों को पूरा करने के उदाहरण दिए गए हैं. इस दस्तावेज़ में दिए गए सभी उदाहरणों में, यह माना गया है कि आपके ऐप्लिकेशन का होस्ट डोमेन example.com है.

यह तय करना कि आपको किस तरह के डेटा का ऐक्सेस मिलेगा

Google की हर सेवा, scope वैल्यू तय करती है. इससे यह तय होता है कि टोकन को उपयोगकर्ता के डेटा का ऐक्सेस मिलेगा या नहीं. स्कोप की उपलब्ध वैल्यू की सूची, Google डेटा के बारे में अक्सर पूछे जाने वाले सवाल में दी गई है. उदाहरण के लिए, Documents List API का इस्तेमाल करने के लिए, scope को https://docs.google.com/feeds/ पर सेट करें. इसके बारे में अक्सर पूछे जाने वाले सवालों में बताया गया है.

ध्यान दें: scope वैल्यू को उस यूआरएल पर सेट करें जिससे आपको ज़रूरी ऐक्सेस मिल सके. इससे गलती से निजी डेटा हासिल करने और उसे लीक करने की संभावना कम हो जाती है. उदाहरण के लिए, अगर आपको मौजूदा उपयोगकर्ता के निजी दस्तावेज़ों की सूची वाले फ़ीड को ऐक्सेस करना है, तो https://docs.google.com/feeds/ जैसे बड़े स्कोप के बजाय https://docs.google.com/feeds/default/private/full स्कोप का इस्तेमाल करें. https://docs.google.com/feeds/ स्कोप से, दस्तावेज़ों की सूची वाले सभी फ़ीड को ऐक्सेस किया जा सकता है.

एक से ज़्यादा स्कोप वाले टोकन

अगर आपको ऐसे टोकन बनाने हैं जो Google के कई डेटा एपीआई को ऐक्सेस करते हैं, तो हर स्कोप को स्पेस वर्ण से अलग करें. यहां दिए गए उदाहरण में, एक ऐसा टोकन बनाया गया है जिसके पास किसी उपयोगकर्ता के Google दस्तावेज़ों और Google Calendar के डेटा, दोनों का ऐक्सेस है.

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
यूआरएल को कोड में बदलना

यूआरएल में दिखने वाले गैर-ASCII वर्णों को एचटीटीपी के ज़रिए ट्रांसमिट करने के लिए, यूआरएल-कोड में बदलना ज़रूरी है. इनमें कोलन, स्लैश, और स्पेस शामिल हैं. Google Data API की क्लाइंट लाइब्रेरी, आपके लिए पैरामीटर को अपने-आप यूआरएल-कोड में बदल देती हैं. इसलिए, पैरामीटर को वैल्यू असाइन करते समय, यूआरएल-कोड में नहीं बदली गई स्ट्रिंग का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अपने कोड में यह असाइनमेंट किया जा सकता है:

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

क्लाइंट लाइब्रेरी को कॉल करने पर, scope पैरामीटर को यूआरएल में अपने-आप कोड में बदल दिया जाता है. इसकी वैल्यू यह होती है:
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 का इस्तेमाल करना:

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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)

इसके अलावा, अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो कॉल थोड़े अलग होते हैं:

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.

अनुरोध टोकन को अनुमति देना

अनुरोध टोकन को अनुमति देने के लिए, आपके ऐप्लिकेशन को उपयोगकर्ता को OAuthAuthorizeToken यूआरएल पर रीडायरेक्ट करना होगा. इससे उपयोगकर्ता को अपने Google खाते में लॉग इन करने के लिए कहा जाएगा. OAuthAuthorizeToken यूआरएल के बारे में ज़्यादा जानकारी के लिए, वेब ऐप्लिकेशन के लिए OAuth की पुष्टि करना लेख पढ़ें.

अपने ऐप्लिकेशन में OAuthAuthorizeToken यूआरएल बनाने के लिए, हर क्लाइंट लाइब्रेरी के लिए यहां दिए गए कोड का इस्तेमाल करें. ध्यान दें कि ये सैंपल, पिछले उदाहरणों के आधार पर बनाए गए हैं.

अनुमति वाले पेज का यूआरएल बनाने के बाद, आपका ऐप्लिकेशन इसका इस्तेमाल कई तरीकों से कर सकता है. इससे उपयोगकर्ता को 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>";

इसके अलावा, मंज़ूरी वाले यूआरएल पर रीडायरेक्ट किया जा सकता है:

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

Python

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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

अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो यह प्रोसेस थोड़ी अलग होती है.

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

कॉलबैक यूआरएल से टोकन निकालना

जब Google आपके ऐप्लिकेशन पर वापस रीडायरेक्ट करता है, तो oauth_token को "oauth_callback_url" यूआरएल में क्वेरी पैरामीटर के तौर पर जोड़ा जाता है. इसके बाद, आपका ऐप्लिकेशन अपने यूआरएल क्वेरी पैरामीटर से टोकन की वैल्यू निकालेगा और ओएयूटीएच पैरामीटर को फिर से सेट करेगा.

क्लाइंट लाइब्रेरी, oauth_token को निकालने के लिए आसान तरीके उपलब्ध कराती हैं. ये सैंपल, पिछले उदाहरणों के आधार पर बनाए गए हैं.

Java

अगर आपने कॉलबैक यूआरएल में टोकन सीक्रेट को सेव करने का विकल्प चुना है (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

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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

अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो इसका इस्तेमाल करें:

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

अगर आपने टोकन के सीक्रेट को कॉलबैक यूआरएल में सेव करने का विकल्प चुना है, तो:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

ऐक्सेस टोकन में अपग्रेड करना

OAuth टोकन डांस का आखिरी चरण यह है कि अनुमति वाले अनुरोध टोकन को लंबे समय तक इस्तेमाल किए जा सकने वाले ऐक्सेस टोकन में अपग्रेड किया जाए. इसके लिए, 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

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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

अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो इसका इस्तेमाल करें:

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

अगर App Engine पर gdata.gauth.AeSave() का इस्तेमाल किया जा रहा है, तो टोकन और टोकन सीक्रेट को लॉग इन किए हुए मौजूदा उपयोगकर्ता के खाते में सेव किया जाएगा.

.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 का इस्तेमाल किया जा रहा है, तो अपने डेटाबेस में ऐक्सेस टोकन की टोकन वैल्यू के साथ-साथ, टोकन सीक्रेट को सेव करना न भूलें. ऐसा न करने पर, बाद में इस्तेमाल करने के लिए ओएयूटीएच पैरामीटर को सही तरीके से फिर से नहीं बनाया जा सकेगा.

ऐक्सेस टोकन का इस्तेमाल करना

ऐक्सेस टोकन मिलने के बाद, सेवा के साथ इंटरैक्ट करने के लिए, Google Data APIs की क्लाइंट लाइब्रेरी के स्टैंडर्ड कॉल का इस्तेमाल करें. लाइब्रेरी, अनुरोधों पर हस्ताक्षर करने और आपके लिए सही 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 का इस्तेमाल करके, पहले ही ऐक्सेस टोकन फ़ेच कर लिया है. साथ ही, बाद में इस्तेमाल करने के लिए, उस टोकन की कुंजी/सीक्रेट को वापस मंगाया जा रहा है.

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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

अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो इसका इस्तेमाल करें:

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.

3-लेग्ड OAuth के अतिरिक्त संसाधन और सैंपल

वापस सबसे ऊपर जाएं

2 लेग्ड OAuth

2 लेग वाले OAuth की मदद से, भरोसेमंद ऐप्लिकेशन को उपयोगकर्ताओं के Google खाते से जुड़े डेटा को ऐक्सेस करने की अनुमति मिलती है. इसके लिए, उपयोगकर्ताओं को सीधे तौर पर शामिल होने की ज़रूरत नहीं होती. दो मुख्य ग्रुप, दो लेग वाले OAuth का इस्तेमाल कर सकते हैं:

G Suite डोमेन एडमिन: एडमिन, स्क्रिप्ट और कस्टम ऐप्लिकेशन बना सकते हैं. इनकी मदद से, Google Data APIs के ज़रिए अपने डोमेन के उपयोगकर्ता डेटा को मैनेज किया जा सकता है. अपने G Suite डोमेन से जुड़ी कुंजी और सीक्रेट को मैनेज करने और ग्लोबल ऐक्सेस कंट्रोल देने के बारे में जानने के लिए, "OAuth कुंजी और सीक्रेट को मैनेज करना" लेख पढ़ें.

तीसरे पक्ष के सॉफ़्टवेयर वेंडर: वेंडर ऐसे ऐप्लिकेशन ऑफ़र कर सकते हैं जो G Suite के साथ इंटिग्रेट करने के लिए, दो लेग वाले OAuth का इस्तेमाल करते हैं. तीसरे पक्ष के ऐप्लिकेशन को ऐक्सेस देने के लिए, एपीआई क्लाइंट मैनेज करें पेज पर जाएं या G Suite Marketplace से ऐप्लिकेशन इंस्टॉल करें.

सामान्य अनुमति देने की प्रोसेस (इसे 3-लेग्ड OAuth भी कहा जाता है) के मुताबिक, ऐक्सेस टोकन की ज़रूरत नहीं होती.

नीचे दिए गए क्लाइंट लाइब्रेरी के सैंपल में, HMAC-SHA1 का इस्तेमाल करके, दो लेग वाले OAuth का इस्तेमाल करने के लिए क्लाइंट को सेट अप करने का तरीका बताया गया है.

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

अगर GDClient पर आधारित v2.0+ क्लास का इस्तेमाल किया जा रहा है, तो इनका इस्तेमाल करें:

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

अगर GDataService पर आधारित v1.0 क्लास का इस्तेमाल किया जा रहा है, तो इसका इस्तेमाल करें:

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 के अतिरिक्त संसाधन और सैंपल

सेल्फ़-साइनिंग वाली निजी कुंजी और सार्वजनिक सर्टिफ़िकेट जनरेट करना

निजी कुंजी का इस्तेमाल, हस्ताक्षर जनरेट करने के लिए किया जाता है. इसे हर अनुरोध के साथ शामिल करना ज़रूरी है. Google, हस्ताक्षर की पुष्टि करने के लिए, सर्टिफ़िकेट में एम्बेड की गई सार्वजनिक कुंजी का इस्तेमाल करता है. सार्वजनिक कुंजी, 1024-बिट आरएसए कुंजी होनी चाहिए. इसे PEM फ़ॉर्मैट में X.509 सर्टिफ़िकेट में एन्कोड किया गया हो. रजिस्ट्रेशन के समय, Google को सर्टिफ़िकेट भेजा जाना चाहिए.

यहां दिए गए सेक्शन में, दो खास टूल का इस्तेमाल करके कुंजियां और सर्टिफ़िकेट जनरेट करने के उदाहरण दिए गए हैं: OpenSSL यूटिलिटी और Java की keytool यूटिलिटी.

ये उदाहरण, Google Data API के लिए खास तौर पर नहीं दिए गए हैं. किसी भी मकसद के लिए कुंजियां जनरेट करने के लिए, इन्हीं यूटिलिटी का इस्तेमाल किया जा सकता है.

इन उदाहरणों में यह माना गया है कि आपकी कंपनी का नाम My_Company है और वह अमेरिका के कैलिफ़ोर्निया के माउंटेन व्यू में है. साथ ही, उसका डोमेन नेम example.com है.

OpenSSL का इस्तेमाल करके कुंजियां जनरेट करना

आरएसए कुंजियों का जोड़ा और उससे जुड़ा सर्टिफ़िकेट बनाने के लिए, इस निर्देश का इस्तेमाल किया जा सकता है:

# 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 फ़ॉर्मैट में निजी पासकोड स्वीकार करता है. ऊपर दिए गए निर्देशों का इस्तेमाल करके, कुंजी/सर्टिफ़िकेट जनरेट करने के बाद, जनरेट की गई .pem फ़ाइल से .pk8 फ़ाइल बनाएं:

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

इसके अलावा, आरएसए कुंजियों का जोड़ा और उससे जुड़ा सर्टिफ़िकेट बनाने के लिए, Java कीस्टोर और keytool यूटिलिटी का इस्तेमाल किया जा सकता है. इस कमांड का इस्तेमाल करें:

# 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

वापस सबसे ऊपर जाएं