هشدار : این صفحه درباره APIهای قدیمیتر گوگل، یعنی APIهای دادههای گوگل، است؛ این صفحه فقط مربوط به APIهایی است که در فهرست APIهای دادههای گوگل فهرست شدهاند و بسیاری از آنها با APIهای جدیدتر جایگزین شدهاند. برای اطلاعات بیشتر در مورد یک API جدید خاص، به مستندات API جدید مراجعه کنید. برای اطلاعات بیشتر در مورد تأیید درخواستها با یک API جدیدتر، به بخش تأیید هویت و مجوز حسابهای گوگل مراجعه کنید.
این سند نحوه استفاده از کتابخانههای کلاینت Google Data API را برای اتصال به احراز هویت AuthSub گوگل برای برنامههای وب شرح میدهد.
رابط AuthSub به یک برنامه تحت وب اجازه میدهد تا از طرف یک کاربر به یک سرویس گوگل دسترسی پیدا کند. برای حفظ سطح بالای امنیت، رابط AuthSub به برنامه این امکان را میدهد که بدون نیاز به مدیریت اطلاعات ورود به حساب کاربری، یک توکن احراز هویت دریافت کند.
کتابخانههای کلاینت Google Data API روشهایی را برای کمک به شما در استفاده از AuthSub در برنامه وب خود ارائه میدهند. به طور خاص، روشهایی برای ساخت URL درخواست، دریافت توکن احراز هویت یکبار مصرف، تبادل توکن یکبار مصرف با توکن جلسه و امضای درخواست وجود دارد.
نکته : کتابخانه کلاینت جاوا اسکریپت، نسخه مخصوص به خود از AuthSub را دارد که AuthSubJS نامیده میشود. برای اطلاعات بیشتر در مورد نحوه استفاده از AuthSubJS در برنامههای جاوا اسکریپت خود، به بخش «استفاده از احراز هویت "AuthSub" با کتابخانه کلاینت جاوا اسکریپت» مراجعه کنید.
مخاطب
این سند برای برنامهنویسانی در نظر گرفته شده است که میخواهند برنامههای تحت وب آنها با استفاده از کتابخانههای کلاینت Google Data APIs به نمایندگی از کاربران به سرویسهای گوگل دسترسی داشته باشند.
این سند فرض میکند که شما با رابط AuthSub و فرآیند کلی ادغام AuthSub در برنامه وب خود آشنا هستید. برای شرح کامل پروتکل AuthSub، به بخش احراز هویت AuthSub برای برنامههای وب مراجعه کنید.
استفاده از AuthSub و APIهای Google Data بدون کتابخانههای کلاینت
اگر میخواهید کلاینت برنامه وب شما با استفاده از AuthSub به عنوان یک سیستم احراز هویت با یک سرویس داده گوگل تعامل داشته باشد، هر آنچه که واقعاً باید بدانید در «احراز هویت AuthSub برای برنامههای وب» موجود است. اگر نمیخواهید، نیازی به استفاده از کتابخانههای کلاینت APIهای گوگل داده ندارید.
در اینجا خلاصهای از نحوهی احراز هویت کاربر توسط برنامهی شما با استفاده از AuthSub آورده شده است:
برنامه شما URL مناسب AuthSub را میسازد و سپس کاربر را به آن URL میفرستد تا بتواند وارد سیستم شود؛ سیستم AuthSub کاربر را به URL مشخص شده در سایت شما برمیگرداند و یک توکن یکبار مصرف برمیگرداند؛ برنامه شما به صورت اختیاری آن توکن را با یک توکن جلسه (session token) تعویض میکند؛ سپس برنامه شما توکن را در هدر Authorization با هر درخواستی که برنامه به سرویس ارسال میکند، ارسال میکند.
کتابخانههای کلاینت Google Data APIs با مدیریت جزئیات مختلف برای شما، این فرآیند مجوزدهی را ساده میکنند. این سند چگونگی آن را توضیح میدهد.
کار با AuthSub و APIهای دادههای گوگل: مثالهایی از کتابخانه کلاینت
این بخش مثالی از استفاده از متدهای کتابخانه کلاینت Google Data APIs را برای دنبال کردن مراحل ذکر شده در بخش « کار با AuthSub » از مستندات AuthSub نشان میدهد.
در این مثال، ما رابط AuthSub را در یک برنامه وب که با تقویم گوگل (Google Calendar) تعامل دارد، ادغام میکنیم (اگرچه برای دنبال کردن مثال نیازی به دانستن چیزی در مورد تقویم گوگل ندارید). این مثال فرض میکند که برنامه وب در example.com میزبانی میشود.
تصمیم بگیرید که از چه نوع توکنی استفاده کنید ( session=0 یا session=1 )
شما میتوانید از توکنهای تککاربره ( session=0 ) یا توکنهای session ( session=1 ) استفاده کنید. این سند از توکنهای session استفاده خواهد کرد، زیرا در برنامههایی که چندین درخواست API ارسال میکنند، مفیدتر هستند. همانطور که در مستندات AuthSub بحث شده است، اگر تصمیم دارید از توکنهای session در برنامه وب خود استفاده کنید، باید خودتان ذخیرهسازی توکن را مدیریت کنید. این سند مدیریت توکن را پوشش نمیدهد. همچنین توجه داشته باشید که توکنهای درخواستی با session=0 را نمیتوان بعداً به یک توکن session با طول عمر بالا تبدیل (ارتقاء) داد.
تصمیم بگیرید که آیا میخواهید برنامه وب خود را ثبت کنید ( secure=0 یا secure=1 )
AuthSub میتواند در سه حالت مختلف استفاده شود، ثبت نشده ، ثبت شده و ثبت شده با امنیت پیشرفته . در ادامه این سند به آخرین گزینه به عنوان AuthSub امن اشاره خواهیم کرد. اگرچه حالت ثبت نشده/ثبت شده نسبت به AuthSub امن، راهاندازی سادهتری دارد، گوگل شما را تشویق میکند که از توکنهای امن برای امنیت پیشرفته آنها استفاده کنید.
نحوه ثبت نام
انتخاب ثبت نام برای برنامه های مبتنی بر وب، مزایای زیر را به برنامه شما می دهد:
- سطح بالاتری از امنیت.
- مورد اعتماد گوگل بودن (هیچ هشداری در صفحه مجوز گوگل به کاربر نمایش داده نمیشود).
ثبت شده + AuthSub امن
اگر AuthSub امن را انتخاب کنید، علاوه بر ثبت برنامه وب خود، باید یک جفت کلید خصوصی RSA و گواهی عمومی خودامضا ایجاد کنید. برای مثالهایی از ایجاد گواهیهای X.509 به بخش «ایجاد کلیدها و گواهیها برای استفاده با حالت ثبتشده » (در زیر) مراجعه کنید.
محدوده دسترسی به دادهها را تعیین کنید
هر سرویس گوگل یک مقدار scope تعریف میکند که دسترسی یک توکن به دادههای کاربر را تعیین (و احتمالاً محدود) میکند. برای فهرست مقادیر scope موجود، به سوالات متداول مراجعه کنید.
از آنجایی که تصمیم گرفتیم با API تقویم گوگل تعامل داشته باشیم، scope باید http://www.google.com/calendar/feeds/ باشد.
نکته : همیشه مقدار scope را روی وسیعترین URL ممکن تنظیم کنید، مگر اینکه به محدودیت دقیقتری نیاز داشته باشید. برای مثال، یک scope محدودتر مانند scope=http://www.google.com/calendar/feeds/default/allcalendars/full دسترسی توکن را فقط به فید allcalendars/full محدود میکند. استفاده از scope=http://www.google.com/calendar/feeds/ امکان دسترسی به همه فیدهای تقویم را فراهم میکند: http://www.google.com/calendar/feeds/* .
توکنهای چند دامنهای
برای ایجاد توکنهایی که به چندین API داده گوگل دسترسی دارند، هر محدوده را با یک فاصله کدگذاری شده با url از هم جدا کنید. مثال زیر توکنی ایجاد میکند که به دادههای مخاطبین گوگل و تقویم گوگل کاربر دسترسی خواهد داشت.
scope=http://www.google.com/calendar/feeds/%20http://www.google.com/m8/feeds/
درخواست توکن احراز هویت یکبار مصرف
برای دریافت توکن AuthSub برای یک کاربر و یک سرویس مشخص، برنامه شما باید کاربر را به آدرس اینترنتی AuthSubRequest هدایت کند، که از او میخواهد وارد حساب گوگل خود شود. (برای اطلاعات بیشتر در مورد آدرس اینترنتی AuthSubRequest ، به بخش کامل احراز هویت AuthSub برای برنامههای وب مراجعه کنید.)
برای ساخت URL AuthSubRequest در برنامه خود، از کد زیر برای هر کتابخانه کلاینت استفاده کنید:
جاوا
import com.google.gdata.client.*; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request secure AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
اگر میخواهید کاربران را در دامنه G Suite خود احراز هویت کنید:
import com.google.gdata.client.*; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.jsp"; String scope = "http://www.google.com/calendar/feeds/"; boolean secure = false; // set secure=true to request AuthSub tokens boolean session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
دات نت
using Google.GData.Client; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(nextUrl, scope, secure, session);
اگر میخواهید کاربران را در دامنه G Suite خود احراز هویت کنید:
using Google.GData.Client; String hostedDomain = "example.com"; String nextUrl = "http://www.example.com/RetrieveToken.aspx"; String scope = "http://www.google.com/calendar/feeds/"; bool secure = false; // set secure=true to request secure AuthSub tokens bool session = true; String authSubUrl = AuthSubUtil.getRequestUrl(hostedDomain, nextUrl, scope, secure, session);
پی اچ پی
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session);
اگر میخواهید کاربران را در دامنه G Suite خود احراز هویت کنید:
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); $hostedDomain = 'example.com'; $nextUrl = 'http://www.example.com/RetrieveToken.php'; $scope = 'http://www.google.com/calendar/feeds/'; $secure = 0; // set $secure=1 to request secure AuthSub tokens $session = 1; $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session) . '&hd=' . $hostedDomain;
پایتون
import gdata.auth next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session)
اگر میخواهید کاربران را در دامنه G Suite خود احراز هویت کنید:
import gdata.auth hosted_domain = 'example.com' next = 'http://www.example.com/RetrieveToken.pyc' scope = 'http://www.google.com/calendar/feeds/' secure = False # set secure=True to request secure AuthSub tokens session = True auth_sub_url = gdata.auth.GenerateAuthSubRequestUrl(next, scope, secure=secure, session=session, domain=hosted_domain)
پس از ساخت URL «بعدی»، برنامه شما میتواند از آن به روشهای مختلفی برای ارسال کاربر به کنترلکننده AuthSubRequest استفاده کند. رایجترین رویکرد، نمایش صفحهای است که به کاربر میگوید برای تأیید دسترسی برنامه شما به حساب گوگل خود، باید لینکی را دنبال کند؛ سپس URL درخواست را به لینک پیوست کنید. به عنوان مثال، میتوانید رشته زیر را در برنامه وب خود خروجی دهید:
String authorizationUrl =
"<p>MyApp needs access to your Google Calendar account to read your Calendar feed. " +
"To authorize MyApp to access your account, <a href=\"" + authSubUrl + "\">log in to your account</a>.</p>";کاربر لینک صفحه AuthSub در گوگل را دنبال میکند و وارد سیستم میشود. سپس سیستم AuthSub با استفاده از URL «بعدی» که شما ارائه دادهاید، کاربر را به برنامه شما هدایت میکند.
توکن یکبار مصرف را استخراج کنید
وقتی گوگل دوباره به برنامه شما هدایت میشود، توکن به عنوان یک پارامتر پرسوجو به URL "بعدی" اضافه میشود. در مورد مثالهای بالا، پس از ورود کاربر، گوگل به URLای مانند http://www.example.com/RetrieveToken?token=DQAADKEDE هدایت میشود. برنامه شما باید مقدار توکن را از پارامتر پرسوجوی URL خود استخراج کند.
اگر برنامه شما قبل از ارسال کاربر به سیستم AuthSub، یک کوکی احراز هویت در مرورگر او تنظیم کند، وقتی گوگل دوباره به آدرس اینترنتی "بعدی" هدایت میشود، برنامه شما میتواند کوکی احراز هویت را بخواند تا تشخیص دهد کدام کاربر به آن آدرس اینترنتی رسیده است. میتوانید از چنین کوکی برای مرتبط کردن شناسه کاربر در برنامه خود با توکن AuthSub بازیابی شده از گوگل استفاده کنید.
کتابخانههای کلاینت روشهای راحتی برای استخراج توکن یکبار مصرف ارائه میدهند:
جاوا
String singleUseToken = AuthSubUtil.getTokenFromReply(httpServletRequest.getQueryString());
دات نت
String singleUseToken = Request.QueryString["token"]; // or String singleUseToken = AuthSubUtil.getTokenFromReply(new Uri(Request.QueryString));
پی اچ پی
$singleUseToken = $_GET['token'];پایتون
current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url)
اگر از Secure AuthSub استفاده میکنید، حتماً کلید خصوصی RSA خود را تنظیم کنید تا SecureAuthSubToken ایجاد شود:
f = open('/path/to/yourRSAPrivateKey.pem') rsa_key = f.read() f.close() current_url = 'http://' + req.hostname + req.unparsed_uri # Unlike the other calls, extract_auth_sub_token_from_url() will create anAuthSubTokenorSecureAuthSubTokenobject. # Use str(single_use_token) to return the token's string value. single_use_token = gdata.auth.extract_auth_sub_token_from_url(current_url, rsa_key=rsa_key)
درخواست توکن جلسه
توکنی که از URL بازیابی میکنید، همیشه یک توکن یکبار مصرف است. مرحله بعدی، ارتقاء آن توکن به یک توکن جلسه با عمر طولانی با استفاده از URL AuthSubSessionToken است، همانطور که در مستندات کامل AuthSub Authentication for Web Applications توضیح داده شده است. اگر از AuthSub امن استفاده میکنید، باید قبل از انجام تبادل، کلید خصوصی RSA خود را تنظیم کنید. در اینجا چند مثال با استفاده از هر یک از کتابخانههای کلاینت آورده شده است:
جاوا
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, null); // ready to interact with Calendar feeds
برای AuthSub امن، به جای ارسال null کلید خصوصی RSA خود را به exchangeForSessionToken ارسال کنید:
import com.google.gdata.client.*; import com.google.gdata.client.calendar.*; java.security.PrivateKey privateKey = AuthSubUtil.getPrivateKeyFromKeystore("AuthSubExample.jks", "privKeyPa$$word", "AuthSubExample", "privKeyPa$$word"); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, privateKey); CalendarService calendarService = new CalendarService("google-ExampleApp-v1.0"); calendarService.setAuthSubToken(sessionToken, privateKey); // ready to interact with Calendar feeds
دات نت
using Google.GData.Client; using Google.GData.Calendar; String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, null).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
برای AuthSub امن، به جای ارسال null کلید خصوصی RSA خود را به exchangeForSessionToken ارسال کنید:
using Google.GData.Client; using Google.GData.Calendar; protected AsymmetricAlgorithm getRsaKey() { X509Certificate2 cert = new X509Certificate2("C:/MyAspSite/test_cert.pfx", "privKeyPa$$word"); RSACryptoServiceProvider privateKey = cert.PrivateKey as RSACryptoServiceProvider; return privateKey; } AsymmetricAlgorithm rsaKey = getRsaKey(); String sessionToken = AuthSubUtil.exchangeForSessionToken(singleUseToken, rsaKey).ToString(); GAuthSubRequestFactory authFactory = new GAuthSubRequestFactory("cl", "google-ExampleApp-v1.0"); authFactory.Token = (String) sessionToken; authFactory.PrivateKey = rsaKey; CalendarService calendarService = new CalendarService(authFactory.ApplicationName); calendarService.RequestFactory = authFactory; // ready to interact with Calendar feeds
پی اچ پی
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken); // Create a Calendar service object and set the session token for subsequent requests $calendarService = new Zend_Gdata_Calendar(null, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
برای AuthSub امن، این تبادل از شما میخواهد که ابتدا یک Zend_Gdata_HttpClient راهاندازی کنید و کلید خصوصی RSA خود را با استفاده از setAuthSubPrivateKeyFile() تنظیم کنید:
require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Gdata_AuthSub'); Zend_Loader::loadClass('Zend_Gdata_Calendar'); $client = new Zend_Gdata_HttpClient(); $client->setAuthSubPrivateKeyFile('/path/to/myrsakey.pem', null, true); $sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken, $client); $calendarService = new Zend_Gdata_Calendar($client, 'google-ExampleApp-v1.0'); $calendarService->setAuthSubToken($sessionToken); // ready to interact with Calendar feeds
پایتون
import gdata.calendar import gdata.calendar.service calendar_service = gdata.calendar.service.CalendarService() calendar_service.UpgradeToSessionToken(single_use_token) # calls gdata.service.SetAuthSubToken() for you # ready to interact with Calendar feeds
نکته : این فرآیند برای AuthSub امن نیز مشابه است، مادامی که از gdata.auth. extract_auth_sub_token_from_url (url, rsa_key=rsa_key) برای استخراج توکن یکبار مصرف استفاده کرده باشید.
نکته : هنگام استفاده از AuthSub امن، خود کلید خصوصی شما از طریق شبکه ارسال نمیشود. کتابخانههای کلاینت امضای منحصر به فردی را که با امضای درخواست با کلید شما ایجاد شده است، ارسال میکنند، نه خود کلید.
از توکن جلسه استفاده کنید
شما میتوانید از توکن جلسه برای تأیید اعتبار درخواستها به سرور با قرار دادن توکن در هدر Authorization، همانطور که در مستندات AuthSub توضیح داده شده است، استفاده کنید.
پس از تنظیم توکن جلسه، میتوانید از فراخوانیهای استاندارد کتابخانه کلاینت Google Data APIs برای تعامل با سرویس استفاده کنید، بدون اینکه نیازی به فکر کردن به توکن داشته باشید. برای جزئیات بیشتر، به مستندات کتابخانه کلاینت و راهنمای توسعهدهندگان Google Data APIs برای سرویس و زبانی که با آن تعامل دارید، مراجعه کنید.
بازیابی اطلاعات مربوط به توکن جلسه
اگر میخواهید آزمایش کنید که کلاینت و سرور شما روی پارامترهای توکن توافق دارند، میتوانید توکن را به هندلر AuthSubTokenInfo ارسال کنید، که مجموعهای از جفتهای نام-مقدار حاوی اطلاعاتی در مورد توکن را برمیگرداند.
جاوا
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, null);
اگر از AuthSub امن استفاده میکنید، کلید خصوصی RSA خود را وارد کنید:
Map<String, String> tokenInfo = AuthSubUtil.getTokenInfo(sessionToken, privateKey);
دات نت
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, null);
اگر از AuthSub امن استفاده میکنید، کلید خصوصی RSA خود را وارد کنید:
Dictionary<String, String> tokenInfo = AuthSubUtil.GetTokenInfo(sessionToken, privateKey);
پی اچ پی
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken);اگر از AuthSub امن استفاده میکنید، Zend_Gdata_HttpClient خود را وارد کنید تا درخواست با کلید خصوصی RSA شما امضا شود:
$tokenInfo = Zend_Gdata_AuthSub::getAuthSubTokenInfo($sessionToken, $client);پایتون
token_info = calendar_service.AuthSubTokenInfo()
لغو توکن جلسه
توکنهای نشست AuthSub منقضی نمیشوند؛ کلاینت شما میتواند توکن نشست را تا هر زمان که نیاز باشد ذخیره کند.
بنابراین، هنگامی که کلاینت شما استفاده از توکن جلسه را تمام کرد، میتواند توکن را با استفاده از هندلر AuthSubRevokeToken ، همانطور که در مستندات AuthSub توضیح داده شده است، لغو کند.
برای مثال، اگر میخواهید توکنها را به روشی سنتی شبیه به جلسه مدیریت کنید، کلاینت شما میتواند در ابتدای جلسه کاربر یک توکن دریافت کند و در پایان جلسه کاربر آن را لغو کند.
برای لغو یک توکن، از دستور زیر در هر کتابخانه کلاینت استفاده کنید:
جاوا
AuthSubUtil.revokeToken(sessionToken, null);
اگر از AuthSub امن استفاده میکنید، کلید خصوصی RSA خود را وارد کنید:
AuthSubUtil.revokeToken(sessionToken, privateKey);
دات نت
AuthSubUtil.revokeToken(sessionToken, null);
اگر از AuthSub امن استفاده میکنید، کلید خصوصی RSA خود را وارد کنید:
AuthSubUtil.revokeToken(sessionToken, privateKey);
پی اچ پی
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken);اگر از AuthSub امن استفاده میکنید، Zend_Gdata_HttpClient خود را وارد کنید تا درخواست با کلید خصوصی RSA شما امضا شود:
$wasRevoked = Zend_Gdata_AuthSub::AuthSubRevokeToken($sessionToken, $client);پایتون
calendar_service.RevokeAuthSubToken()
منابع و نمونههای بیشتر
- مثالهای AuthSub در وبلاگ نکات API داده گوگل
- نمونه کتابخانه کلاینت پایتون AuthSub
- نمونه کتابخانه کلاینت جاوا AuthSub
- مقاله: استفاده از AuthSub با کتابخانه کلاینت .NET
- مقاله: استفاده از احراز هویت "AuthSub" با کتابخانه کلاینت جاوا اسکریپت
ایجاد یک کلید خصوصی خودامضا و گواهی عمومی برای استفاده با AuthSub امن
کلید خصوصی برای تولید امضا استفاده میشود که باید به همراه هر درخواست ارائه شود. کلید عمومی تعبیه شده در گواهی توسط گوگل برای تأیید امضا استفاده میشود. کلید عمومی باید یک کلید 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