Google डेटा प्रोटोकॉल क्लाइंट लाइब्रेरी में OAuth

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

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

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

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

दर्शक

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

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

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

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

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

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

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

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

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

1. आपका डोमेन रजिस्टर किया जा रहा है

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

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

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

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

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

अपने डेटा ऐक्सेस का दायरा तय करना

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

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

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

एक से ज़्यादा 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 पैरामीटर फिर से बनाने चाहिए.

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

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

ऐक्सेस टोकन मिलने के बाद, उस सेवा से इंटरैक्ट करने के लिए, Google Data API की क्लाइंट लाइब्रेरी के स्टैंडर्ड कॉल का इस्तेमाल करें. लाइब्रेरी, अनुरोधों पर हस्ताक्षर करेगी. साथ ही, आपके लिए अनुमति देने वाला सही हेडर भी शामिल करेगी. आम तौर पर, आपको कुकी या डेटाबेस से उपयोगकर्ता का टोकन रीकॉल करना होगा. इन उदाहरणों में बताया गया है कि 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

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

G Suite डोमेन एडमिन: एडमिन ऐसी स्क्रिप्ट और कस्टम ऐप्लिकेशन बना सकते हैं जो Google Data API की मदद से, अपने डोमेन के उपयोगकर्ता डेटा को मैनेज करते हैं. अपने 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);
}

अतिरिक्त 2-लेग्ड OAuth संसाधन और नमूने

खुद के हस्ताक्षर वाली निजी कुंजी और सार्वजनिक प्रमाणपत्र जनरेट करना

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

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

ये उदाहरण, खास तौर पर Google डेटा एपीआई के लिए नहीं हैं. इन उपयोगिताओं की मदद से, किसी भी मकसद से कुंजियां जनरेट की जा सकती हैं.

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

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

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

# 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

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