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

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

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

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

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

حضار

این سند برای برنامه نویسانی در نظر گرفته شده است که می خواهند برنامه های مبتنی بر وب آنها از طرف کاربران با استفاده از کتابخانه های سرویس گیرنده Google Data API به خدمات Google دسترسی داشته باشند.

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

استفاده از OAuth سه پایه و APIهای Google Data بدون کتابخانه های سرویس گیرنده

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

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

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

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

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

OAuth مستلزم آن است که همه تماس‌های API به صورت دیجیتال امضا شوند. گوگل از روش های امضای 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 است.

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

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

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

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

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

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

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

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

هنگامی که با کتابخانه مشتری تماس می گیرید، پارامتر scope به طور خودکار به مقدار زیر کدگذاری می شود:
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);
}

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

پایتون

استفاده از 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 هدایت کند، که از آنها می خواهد به حساب Google خود وارد شوند. برای اطلاعات بیشتر در مورد 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);

PHP

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$approvalUrl = $consumer->getRedirectUrl(array('hd' => 'default'));
echo "<a href=\"$approvalUrl\">Grant access</a>";

از طرف دیگر، می‌توانید به سادگی به URL تأیید هدایت شوید:

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

پایتون

اگر از کلاس‌های جدیدتر v2.0+ مبتنی بر GDClient استفاده می‌کنید، از:

# req_token is from previous call to client.GetOAuthToken()
domain = None  # If on a G Suite domain, use your domain (e.g. 'example.com').
self.redirect(request_token.generate_authorization_url(google_apps_domain=domain))

اگر از کلاس‌های قدیمی‌تر v1.0 مبتنی بر GDataService استفاده می‌کنید، روند کمی متفاوت است.

# req_token is from previous call to client.FetchOAuthRequestToken()
oauth_callback_url = 'http://%s/get_access_token' % self.request.host
self.redirect(client.GenerateOAuthAuthorizationURL(callback_url=oauth_callback_url))

.خالص

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

استخراج نشانه از URL بازگشت به تماس

وقتی Google به برنامه شما برمی گردد، oauth_token به عنوان پارامتر پرس و جو به URL " oauth_callback_url " اضافه می شود. سپس برنامه شما باید مقدار رمز را از پارامتر query 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

این مرحله هنگام استفاده از کتابخانه 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)

اگر از کلاس‌های قدیمی‌تر v1.0 مبتنی بر GDataService استفاده می‌کنید، از:

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.secret = # TODO: recall saved request_token and set the token secret here.
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

این فرآیند برای RSA-SHA1 مشابه است، اما بدون رمز رمز:

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

.خالص

اگر انتخاب کرده اید که رمز رمز در URL بازگشت به تماس باقی بماند:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

ارتقاء به یک نشانه دسترسی

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

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

جاوا

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

پایتون

اگر از کلاس‌های جدیدتر v2.0+ مبتنی بر GDClient استفاده می‌کنید، از:

# Upgrade the token and save in the user's datastore
access_token = client.GetAccessToken(request_token)

# If you're using Google App Engine, you can call the AeSave() method to save
# the access token under the current logged in user's account.
#gdata.gauth.AeSave(access_token, token_key)

اگر از کلاس‌های قدیمی‌تر v1.0 مبتنی بر GDataService استفاده می‌کنید، از:

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

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

.خالص

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 APIs برای تعامل با سرویس استفاده کنید. کتابخانه از امضای درخواست‌ها و گنجاندن سرصفحه صحیح مجوز برای شما مراقبت می‌کند. به طور معمول، رمز کاربر را از یک کوکی یا پایگاه داده به یاد می آورید. این مثال‌ها نحوه بازسازی پارامترهای 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());
  }
  

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

پایتون

این قطعه فرض می‌کند که شما قبلاً یک نشانه دسترسی (با استفاده از HMAC-SHA1 ) واکشی کرده‌اید و در حال فراخوانی آن کلید/راز رمز برای استفاده بعدی هستید.

اگر از کلاس‌های جدیدتر v2.0+ مبتنی بر GDClient استفاده می‌کنید، از:

client = gdata.docs.client.DocsClient(source='yourCo-yourAppName-v1')
client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY, CONSUMER_SECRET, TOKEN,
                                               TOKEN_SECRET, gdata.gauth.ACCESS_TOKEN)
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

اگر از کلاس‌های قدیمی‌تر v1.0 مبتنی بر GDataService استفاده می‌کنید، از:

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

# the token key and secret should be recalled from your database
client.SetOAuthToken(gdata.auth.OAuthToken(key=TOKEN, secret=TOKEN_SECRET))

feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

.خالص

اگر از HMAC-SHA1 استفاده می کنید:

OAuthParameters parameters = new OAuthParameters() {
  ConsumerKey = CONSUMER_KEY,
  ConsumerSecret = CONSUMER_SECRET,
  Token = ACCESS_TOKEN,
  TokenSecret = TOKEN_SECRET
}

GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);

DocsService service = new DocsService(APPLICATION_NAME);
service.RequestFactory = requestFactory;

DocumentsListQuery query = new DocumentsListQuery();
DocumentsFeed feed = service.Query(query);
foreach (DocumentEntry entry in feed.Entries) {
  Console.WriteLine(entry.Title.Text);
}

تفاوت RSA-SHA1 در این است که شما نیازی به تنظیم رمز دسترسی ندارید و ساخت شی امضا کننده متفاوت است:

RSA-SHA1 is not supported yet.

منابع و نمونه های OAuth 3-پایه اضافی

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

OAuth 2 پا

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

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

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

طبق جریان مجوز عادی (که به آن OAuth سه پایه نیز گفته می شود) به یک نشانه دسترسی نیازی نیست.

نمونه‌های کتابخانه مشتری زیر نشان می‌دهند که چگونه مشتری خود را برای استفاده از 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());
}

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

پایتون

اگر از کلاس‌های جدیدتر v2.0+ مبتنی بر GDClient استفاده می‌کنید، از:

import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
requestor_id = 'any.user@anydomain.com'

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')
client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
    CONSUMER_KEY, CONSUMER_SECRET, requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

اگر از کلاس‌های قدیمی‌تر v1.0 مبتنی بر GDataService استفاده می‌کنید، از:

import gdata.auth
import gdata.docs.service

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
SIG_METHOD = gdata.auth.OAuthSignatureMethod.HMAC_SHA1

requestor_id = 'any.user@anydomain.com'

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET,
                               two_legged_oauth=True, requestor_id=requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

# Change to another user on your domain
client.GetOAuthInputParameters().requestor_id = 'another.user@example.com'

.خالص

using Google.GData.Client;
using Google.GData.Documents;

// Create an OAuth factory to use
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", "yourCompany-YourAppName-v1");
requestFactory.ConsumerKey = "example.com";
requestFactory.ConsumerSecret = "abc123doremi";

String user = "any.user@anydomain.com";

DocumentsService client = new DocumentsService("yourCompany-YourAppName-v1");
client.RequestFactory = requestFactory;

// Retrieve user's list of Google Docs
DocumentsListQuery query = new DocumentsListQuery();
query.Uri = new OAuthUri("https://docs.google.com/feeds/default/private/full", user, requestFactory.ConsumerKey);

DocumentsFeed feed = client.Query(query);

foreach (DocumentEntry entry in feed.Entries)
{
  Console.WriteLine(entry.Title.Text);
}

منابع و نمونه های OAuth 2-پایه اضافی

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

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

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

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

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

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

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

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

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

این مرحله یک فایل PFX از کلید خصوصی و گواهی شما تولید می کند. این فایل را می توان به کتابخانه سرویس گیرنده دات نت وارد کرد تا درخواست های انجام شده به Google Data 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

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