OAuth در کتابخانه‌های کلاینت پروتکل داده گوگل

هشدار : این صفحه درباره APIهای قدیمی‌تر گوگل، یعنی APIهای داده‌های گوگل، است؛ این صفحه فقط مربوط به APIهایی است که در فهرست APIهای داده‌های گوگل فهرست شده‌اند و بسیاری از آنها با APIهای جدیدتر جایگزین شده‌اند. برای اطلاعات بیشتر در مورد یک API جدید خاص، به مستندات API جدید مراجعه کنید. برای اطلاعات بیشتر در مورد تأیید درخواست‌ها با یک API جدیدتر، به بخش تأیید هویت و مجوز حساب‌های گوگل مراجعه کنید.

این سند نحوه استفاده از کتابخانه‌های کلاینت Google Data API را برای اتصال به احراز هویت OAuth گوگل برای برنامه‌های وب شرح می‌دهد.

رابط OAuth به یک برنامه تحت وب اجازه می‌دهد تا از طرف یک کاربر به یک سرویس گوگل دسترسی پیدا کند. برای حفظ سطح بالای امنیت، OAuth به برنامه این امکان را می‌دهد که بدون نیاز به دستکاری اطلاعات ورود به حساب کاربری، یک توکن دسترسی دریافت کند.

کتابخانه‌های کلاینت Google Data API روش‌هایی را برای کمک به شما در استفاده از OAuth در برنامه وب خود ارائه می‌دهند. به طور خاص، روش‌هایی برای ساخت توکن درخواست برای دریافت، تأیید توکن درخواست و تبادل توکن درخواست تأیید شده با توکن دسترسی وجود دارد. این کتابخانه‌ها همچنین الگوریتم‌های امضای لازم را هنگام ارسال درخواست به سرویس Google Data مدیریت می‌کنند.

مخاطب

این سند برای برنامه‌نویسانی در نظر گرفته شده است که می‌خواهند برنامه‌های تحت وب آنها با استفاده از کتابخانه‌های کلاینت Google Data APIs به نمایندگی از کاربران به سرویس‌های گوگل دسترسی داشته باشند.

این سند فرض می‌کند که شما با رابط OAuth و فرآیند کلی برای گنجاندن OAuth در برنامه وب خود آشنا هستید. برای شرح کامل پروتکل OAuth، به «احراز هویت OAuth برای برنامه‌های وب» یا مشخصات رسمی در oauth.net مراجعه کنید.

استفاده از APIهای 3-legged OAuth و Google Data بدون کتابخانه‌های کلاینت

اگر می‌خواهید برنامه وب شما با استفاده از OAuth به عنوان یک روش احراز هویت با یک سرویس داده گوگل تعامل داشته باشد، هر آنچه که باید بدانید در OAuth Authentication for Web Applications موجود است. اگر نمی‌خواهید، نیازی به استفاده از کتابخانه‌های کلاینت APIهای گوگل داده نیست.

در اینجا خلاصه‌ای از نحوه‌ی احراز هویت کاربر توسط برنامه‌ی شما با استفاده از OAuth آورده شده است:

  1. برنامه شما یک درخواست امضا شده برای دریافت توکن درخواست اولیه OAuth از نقطه پایانی OAuthRequestToken ارسال می‌کند.
  2. برنامه شما کاربر را به آدرس اینترنتی OAuthAuthorizeToken مناسب هدایت می‌کند تا توکن درخواست را تأیید کند.
  3. پس از اعطای دسترسی، کاربر به برنامه شما (آدرس oauth_callback ) هدایت می‌شود.
  4. برنامه شما با استفاده از نقطه پایانی OAuthGetAccessToken یک درخواست امضا شده برای ارتقاء توکن درخواست مجاز به یک توکن دسترسی ارسال می‌کند.

کتابخانه‌های کلاینت Google Data APIs با مدیریت جزئیات مختلف برای شما، این فرآیند مجوزدهی را ساده می‌کنند. این سند چگونگی آن را توضیح می‌دهد.

ثبت برنامه وب شما

OAuth مستلزم آن است که تمام فراخوانی‌های API به صورت دیجیتالی امضا شوند. گوگل از روش‌های امضای HMAC-SHA1 و RSA-SHA1 پشتیبانی می‌کند. برای امضای درخواست‌ها، ابتدا برنامه شما باید در گوگل ثبت شود . پس از ثبت، گوگل یک کلید مصرف‌کننده (و یک کلید مخفی برای استفاده با HMAC-SHA1 ) و مکانی برای آپلود گواهی عمومی در اختیار شما قرار می‌دهد.

۱. ثبت دامنه

لطفاً مراحل ذکر شده در ثبت نام برای برنامه‌های کاربردی مبتنی بر وب را دنبال کنید.

۲. ایجاد یک جفت کلید خصوصی/گواهی عمومی (اختیاری)

اگر تصمیم دارید از RSA-SHA1 به عنوان oauth_signature_method استفاده کنید، باید یک جفت کلید خصوصی و گواهی عمومی RSA خودامضا ایجاد کنید. برای مثال‌هایی در مورد نحوه انجام این کار، به بخش «ایجاد کلید خصوصی و گواهی عمومی خودامضا» (در زیر) مراجعه کنید.

کار با OAuth سه‌گانه و APIهای داده‌های گوگل: مثال‌هایی از کتابخانه کلاینت

بخش‌های زیر نمونه‌هایی از استفاده از متدهای کتابخانه کلاینت Google Data APIs را برای دنبال کردن مراحل ذکر شده در بخش « کار با OAuth » از مستندات OAuth نشان می‌دهند. همه مثال‌های این سند فرض می‌کنند که دامنه میزبان برنامه شما example.com است.

تعیین محدوده دسترسی به داده‌ها

هر سرویس گوگل یک مقدار scope تعریف می‌کند که دسترسی توکن به داده‌های کاربر را تعیین می‌کند. مقادیر دامنه موجود در بخش پرسش‌های متداول داده‌های گوگل فهرست شده‌اند. برای مثال، برای استفاده از API فهرست اسناد، scope همانطور که در بخش پرسش‌های متداول ذکر شده است، روی https://docs.google.com/feeds/ تنظیم کنید.

توجه : مقدار scope را روی محدودترین URL که دسترسی مورد نیاز شما را فراهم می‌کند، تنظیم کنید. این کار احتمال دسترسی و نشت تصادفی داده‌های شخصی را کاهش می‌دهد. برای مثال، اگر می‌خواهید به فید فهرست اسناد خصوصی کاربر فعلی دسترسی داشته باشید، به جای دامنه وسیع‌تری مانند https://docs.google.com/feeds/default/private/full از دامنه https://docs.google.com/feeds/ استفاده کنید که دسترسی به همه فیدهای فهرست اسناد را فراهم می‌کند.

توکن‌های چند دامنه‌ای

برای ایجاد توکن‌هایی که به چندین API داده گوگل دسترسی دارند، هر محدوده را با یک کاراکتر فاصله از هم جدا کنید. مثال زیر یک توکن با دسترسی به داده‌های Google Documents و Google Calendar کاربر ایجاد می‌کند.

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
رمزگذاری URL

کاراکترهای غیر ASCII که در URLها ظاهر می‌شوند، از جمله دونقطه، اسلش و فاصله، باید برای انتقال از طریق HTTP، کدگذاری URL شوند. کتابخانه‌های کلاینت Google Data API به طور خودکار پارامترها را برای شما کدگذاری URL می‌کنند، بنابراین می‌توانید هنگام اختصاص مقادیر به پارامترها، به سادگی از رشته‌های کدگذاری نشده URL استفاده کنید. به عنوان مثال، می‌توانید انتساب زیر را در کد خود انجام دهید:

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

وقتی کتابخانه کلاینت را فراخوانی می‌کنید، پارامتر scope به طور خودکار به صورت URL-encoded به مقدار زیر تبدیل می‌شود:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

واکشی توکن درخواست

جاوا

برای 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);
}

پی اچ پی

استفاده از 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)));
}

پایتون

استفاده از 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)

دات نت

استفاده از 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 هدایت کند، که از آنها می‌خواهد وارد حساب گوگل خود شوند. برای اطلاعات بیشتر در مورد URL OAuthAuthorizeToken ، به بخش کامل احراز هویت OAuth برای برنامه‌های وب مراجعه کنید.

برای ساخت URL OAuthAuthorizeToken در برنامه خود، از موارد زیر برای هر کتابخانه کلاینت استفاده کنید. توجه داشته باشید که این نمونه‌ها بر اساس مثال‌های قبلی ساخته شده‌اند.

پس از ساخت URL صفحه تأیید، برنامه شما می‌تواند از آن به روش‌های مختلفی برای ارسال کاربر به هندلر OAuthAuthorizeToken استفاده کند. رایج‌ترین رویکرد، هدایت کاربر یا نمایش لینکی به آن صفحه است.

جاوا

برای HMAC-SHA1 :

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

برای RSA-SHA1 :

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

پی اچ پی

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

پایتون

اگر از کلاس‌های جدیدتر 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))

اگر از کلاس‌های قدیمی‌تر نسخه ۱.۰ مبتنی بر 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))

دات نت

string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters);
Console.WriteLine(authorizationUrl);

استخراج توکن از URL فراخوانی

وقتی گوگل دوباره به برنامه شما هدایت می‌شود، oauth_token به عنوان یک پارامتر پرس‌وجو به URL " oauth_callback_url " اضافه می‌شود. سپس برنامه شما باید مقدار توکن را از پارامتر پرس‌وجوی URL خود استخراج کرده و پارامترهای oauth را دوباره برقرار کند.

کتابخانه‌های کلاینت، روش‌های راحتی برای استخراج oauth_token ارائه می‌دهند. این نمونه‌ها بر اساس نمونه‌های قبلی ساخته شده‌اند.

جاوا

اگر تصمیم گرفته‌اید که رمز توکن را در 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 ضروری نیست.

پایتون

اگر از کلاس‌های جدیدتر 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)

اگر از کلاس‌های قدیمی‌تر نسخه ۱.۰ مبتنی بر 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'

دات نت

اگر تصمیم گرفته‌اید که رمز توکن را در URL فراخوانی (callback URL) حفظ کنید:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

ارتقا به یک توکن دسترسی

آخرین مرحله در رقص توکن OAuth، ارتقاء توکن درخواست مجاز به یک توکن دسترسی طولانی مدت با استفاده از URL OAuthGetAccessToken است، همانطور که در مستندات کامل OAuth Authentication for Web Applications توضیح داده شده است.

در اینجا چند مثال با استفاده از هر یک از کتابخانه‌های کلاینت آورده شده است:

جاوا

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

پی اچ پی

if (!isset($_SESSION['ACCESS_TOKEN'])) {
  if (!empty($_GET) && isset($_SESSION['REQUEST_TOKEN'])) {
    $_SESSION['ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN'])));
  }
}

پایتون

اگر از کلاس‌های جدیدتر 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)

اگر از کلاس‌های قدیمی‌تر نسخه ۱.۰ مبتنی بر GDataService استفاده می‌کنید، از موارد زیر استفاده کنید:

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

اگر از gdata.gauth.AeSave() در App Engine استفاده می‌کنید، توکن و رمز توکن برای شما تحت نام کاربری فعلی وارد شده ذخیره می‌شوند.

دات نت

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 را برای استفاده‌های بعدی به درستی بازسازی کنید.

استفاده از توکن دسترسی

پس از دریافت توکن دسترسی، از فراخوانی‌های استاندارد کتابخانه کلاینت APIهای داده گوگل برای تعامل با سرویس استفاده کنید. این کتابخانه، امضای درخواست‌ها و درج هدر صحیح مجوز را برای شما انجام خواهد داد. معمولاً، شما توکن کاربر را از یک کوکی یا پایگاه داده فراخوانی خواهید کرد. این مثال‌ها نحوه بازسازی پارامترهای oauth و برقراری فراخوانی کتابخانه کلاینت را نشان می‌دهند.

جاوا

اگر از 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());
  }
  

پی اچ پی

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

پایتون

این قطعه کد فرض می‌کند که شما قبلاً یک توکن دسترسی (با استفاده از 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

اگر از کلاس‌های قدیمی‌تر نسخه ۱.۰ مبتنی بر 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

دات نت

اگر از 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 سه‌پایه

بازگشت به بالا

احراز هویت دو پا

OAuth دو مرحله‌ای به برنامه‌های مورد اعتماد اجازه می‌دهد تا بدون دخالت مستقیم کاربران به داده‌های گوگل آنها دسترسی پیدا کنند. دو گروه کلیدی می‌توانند از OAuth دو مرحله‌ای استفاده کنند:

مدیران دامنه G Suite: مدیران می‌توانند اسکریپت‌ها و برنامه‌های سفارشی بسازند که داده‌های کاربر را برای دامنه خود از طریق APIهای Google Data مدیریت می‌کنند. برای کسب اطلاعات در مورد مدیریت کلید و رمز مرتبط با دامنه G Suite شما و اعطای کنترل دسترسی جهانی، به «مدیریت کلید و رمز OAuth» مراجعه کنید.

فروشندگان نرم‌افزار شخص ثالث: فروشندگان ممکن است برنامه‌هایی را ارائه دهند که از OAuth دو مرحله‌ای برای ادغام با G Suite استفاده می‌کنند. دسترسی به برنامه‌های شخص ثالث را می‌توان در صفحه مدیریت API کلاینت یا با نصب از G Suite Marketplace اعطا کرد.

طبق روال معمول احراز هویت (که به آن OAuth سه‌گانه نیز می‌گویند)، نیازی به توکن دسترسی نیست.

نمونه‌های کتابخانه کلاینت زیر نحوه راه‌اندازی کلاینت شما برای استفاده از 2 Legged OAuth با استفاده از HMAC-SHA1 را نشان می‌دهند.

جاوا

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

پی اچ پی

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

پایتون

اگر از کلاس‌های جدیدتر 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

اگر از کلاس‌های قدیمی‌تر نسخه ۱.۰ مبتنی بر 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'

دات نت

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 دو-پا

تولید کلید خصوصی خودامضا و گواهی عمومی

کلید خصوصی برای تولید امضا استفاده می‌شود که باید به همراه هر درخواست ارائه شود. کلید عمومی تعبیه شده در گواهی توسط گوگل برای تأیید امضا استفاده می‌شود. کلید عمومی باید یک کلید RSA 1024 بیتی باشد که در گواهی X.509 با فرمت PEM کدگذاری شده است. گواهی باید در زمان ثبت نام به گوگل ارسال شود.

بخش‌های زیر نمونه‌هایی از نحوه تولید کلیدها و گواهی‌ها با استفاده از دو ابزار خاص ارائه می‌دهند: ابزار OpenSSL و ابزار keytool جاوا.

این مثال‌ها مختص APIهای داده‌های گوگل نیستند؛ شما می‌توانید از همین ابزارها برای تولید کلیدها برای هر منظوری استفاده کنید.

مثال‌ها فرض می‌کنند که شرکت شما My_Company نام دارد و در مانتین ویو، کالیفرنیا، ایالات متحده، با نام دامنه example.com واقع شده است.

تولید کلیدها با استفاده از OpenSSL

برای ایجاد یک جفت کلید RSA و گواهی مربوطه، می‌توانید از دستور زیر استفاده کنید:

# 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 خواهد بود (که می‌تواند هنگام ثبت نام به گوگل ارسال شود).

تولید کلید برای کلاینت .NET

چارچوب .NET کلیدها یا گواهی‌های ذخیره شده در قالب PEM را درک نمی‌کند. بنابراین، پس از ایجاد فایل .pem، یک مرحله اضافی لازم است:

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

این مرحله یک فایل PFX از کلید خصوصی و گواهی شما ایجاد می‌کند. این فایل را می‌توان به کتابخانه کلاینت .NET وارد کرد تا درخواست‌های ارسالی به APIهای داده گوگل را به صورت دیجیتالی امضا کند.

تولید کلید برای کلاینت جاوا

کلاینت جاوا کلیدهای خصوصی را با فرمت PKCS#8 می‌پذیرد. پس از تولید کلید/گواهی با استفاده از دستورالعمل‌های بالا ، یک فایل .pk8 از فایل .pem تولید شده خود ایجاد کنید:

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

به عنوان یک روش جایگزین، می‌توانید از مخزن کلید جاوا و ابزار keytool برای ایجاد یک جفت کلید RSA و گواهی مربوطه استفاده کنید. از دستور زیر استفاده کنید:

# 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 رمز عبور برای محافظت از keystore را مشخص می‌کند. پارامتر -keypass رمز عبور برای محافظت از کلید خصوصی را مشخص می‌کند.

برای نوشتن گواهی در فایلی که بتوان از آن در ابزار ManageDomains استفاده کرد، از دستور زیر استفاده کنید:

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

بازگشت به بالا