تبلیغات

آموزش اهراز هویت با گوگل پلاس در برنامه نویسی اندروید

بدون شک، اپلیکیشن‌ها و بازی‌های زیادی را دیده‌اید که با استفاده از اکانت گوگل پلاس، در آنها به طور مستقیم و بدون ثبت نام وارد می‌شویم! اما حالا، روش پیاده سازی موارد پایه‌ای این قابلیت را یاد خواهیم گرفت تا بتوانیم در اپلیکیشن‌های خودمان نیز از آن استفاده کنیم.

این قابلیت بایستی روی اندروید 4.2.2 به بالا تست شود.

1. فعال کردن Sign-In برای برنامه

قبل از شروع به کدنویسی قابلیت‌های اپلیکیشن اندروید، ابتدا نیاز داریم تا API قابلیت Sign-In را برای اپلیکیشن خود روشن کنیم؛ که از بخش Google Developer’s console سایت گوگل انجام می‌گیرد! در ادامه این کار را انجام می‌دهیم.

ساخت یک پروژه‌ی جدید

  1. وارد لینک «https://console.developers.google.com/project» شوید.
  2. روی CREATE PROJECT کلیک کنید.
  3. در بخش Project name، یک نام برای پروژه‌‌ی خود انتخاب کنید. برای مثال: FuLLKade-SignIn
  4. روی CREATE کلیک کنید.
    – کمی صبر کنید تا پیام اتمام عملیات ایجاد پروژه برایتان ظاهر شود.
    – سپس صفحه را ریستارت کنید تا پروژه‌ی خود را در لیست مشاهده نمایید.
    – همانطور که می‌بینید، یک یک project id نیز با توجه به نام پروژه‌ی شما برای آن در نظر گرفته شده است که منحصر به فرد است!

فعال کردن Google+ API

  1. روی پروژه کلیک کنید تا وارد صفحه‌ی اختصاصی آن شوید.
  2. از بخش سرچ، عبارت API را جستجو کرده و سپس روی APIs & Services کلیک کنید.
  3. روی ENABLE APIS AND SERVICE کلیک کنید.
  4. به دنبال Google+ API بگردید و روی آن کلیک کنید.
  5. روی ENABLE کلیک کنید تا برای پروژه‌ی شما فعال شود. (کمی صبر کنید تا صفحه بارگزاری شود.)
  6. همان مرحله‌ی دوم را تکرار کنید تا به صفحه‌ی Dashboard برگردید.
  7. در انتهای صفحه‌ی باز شده، جدولی را مشاهده می‌کنید که Google+ API نیز در آن قرار دارد؛ روی آن کلیک کنید.
    اینجا صفحه‌ی پلاگین Google+ API مربوط به پروژه‌ی شماست.

پیکربندی مجوزها

گوگل می‌خواهد مطمئن شود که اپلیکیشن شما، یک اپلیکیشن فیک (جعلی) نیست؛ و برای همین، شما به SHA-1 کلید (keystore) پروژه‌ی اندروید خود نیاز خواهید داشت! که البته برای هدف توسعه، از مجوز دیباگ می‌توانید استفاده کنید و زمانی که قصد انتشار دارید، از یک مجوز واقعی keystore استفاده نمایید.

برای دسترسی به SHA-1 کلید دیباگ:

  • در مک و لینوکس، به مسیر ~/.android بروید.
  • در ویندوز، به مسیر زیر بروید:
    C:\Users\<your user name>\.android.C:\Users\<your user name>\.android

توجه داشته باشید که .android، یک پوشه‌ی مخفی است.

فایل debug.keystore شامل SHA-1 کلید دیباگ است. برای بدست آوردن آن، وارد CMD شده و دستور زیر را اجرا کنید:

توجه داشته باشید که ابتدا بایستی مسیر فایل debug.keystore خودتان را در دستور بالا جایگزاری کرده و سپس آن اجرا کنید. پس از اجرای آن، متنی چاپ خواهد شد. که باید به دنبال Certificate fingerprints گشته و آن را پیدا کنید؛ سپس در زیر آن، SHA1 و حتی SHA256 را مشاهده می‌کنید. مقدار مقابل SHA1 را کپی کرده و در جایی نگهدارید تا در مرحله‌ی بعدی از آن استفاده کنیم. مثلا برای من به صورت زیر است:

04:55:2F:18:EC:27:44:D5:83:EC:AF:3D:02:D7:5B:1C:5E:77:88:42


پیکربندی Consent Screen

  1. در همان صفحه‎‌ی APIs & Services، روی Credentials کلیک کنید.
  2. وارد سربرگ Consent Screen شوید.
  3. اطلاعات موجود در صفحه‌ی باز شده را تکمیل کنید.
    در واقع اطلاعات اپلیکیشن و محصول خودتان را در اینجا تکمیل می‌کنید.
    نام اپلیکیشن (Application name) و ایمیل پشتیبانی (Support email) ضروری بوده و بقیه اختیاری هستند.
  4. در نهایت روی Save کلیک کنید.

پیکربندی Credentials

  1. در همان صفحه، به سربرگ Credentials برگردید.
  2. روی Create credentials  کلیک کنید.
  3. روی OAuth Client ID کلیک کنید.
  4. نوع اپلیکیشن (Application type) خود را مشخص کنید که طبیعتا در اینجا باید Android باشد. یپی گزینه‌های زبر ظاهر خواهد شد:
    • Name: یک نام برای OAuth client ID (این نام، نام نمایشی اپلیکیشن نیست.)
    • Signing-certificate fingerprint: همان SHA-1 که در بالا کپی کردیم.
    • Package name: پکیج اپلیکیشن
  5. روی Create کلیک کنید.
  6. صبر کنید تا پنحره‌ی OAuth client نمایش داده شود؛ سپس مقدار Client ID نمایش داده می‌‎شود.
  7. روی OK کلیک کنید.
  8. در لیستی که ظاهر خواهد شد، Client ID خود را مشاهده می‌کنید.

2. ایجاد اپلیکیشن اندرویدی

در این بخش، با مباحث پایه‌ی ایجاد اپلیکیشنی با قابلیت Sign in گوگل آشنا می‌شویم.


ایجاد اپلیکیشن جدید

یک اپلیکیشن اندرویدی ایجاد کنید. پکیج باید همان پکیجی باشد که در مراحل قبلی و داخل سایت گوگل مشخص کردید! برای من به صورت زیر است:

  • عنوان پروژه: FuLLKadeSignIn
  • پکیج: com.fullkade.signin

پیکربندی build.gradle ماژول اپلیکیشن

موارد زیر را به Dependencies های پروژه‌ی خود اضافه کنید:


پیکربندی AndroidManifest.xml

کد زیر را به قبل از بسته شدن تگ Application اضافه کنید:

دسترسی‌های زیر را اضافه کنید:

توجه
GET_ACCOUNTS، جزء دسترسی‌های خطرناک بوده و بایستی به صورت رئال تایم تایید شود؛ در غیر اینصورت به اطلاعات اکانت نمی‌توانید دسترسی داشته باشید.


ایجاد یک UI ساده

فایل Layout ای به صورت زیر می‌سازیم:

3. کدنویسی اپلیکیشن

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

مراحل

ابتدا به MainActivity رفته و موارد زیر را ایمپورت کنید:

اینترفیس‌های زیر را برای اکتیویتی خود پیاده کنید:

این اینترفیس‌ها، متدهایی با نام‌های onConnected، onConnectionSuspended، onConnectionFailed و onClick را به اکتیویتی اضافه می‌کنند؛ قرار است در ادامه این متدها با توجه به رویدادهایی که رخ می‌دهند اجرا شوند.


پیاده‌سازی ثابت‌ها و متغیرها

ابتدا ثابت‌های زیر را به اکتیویتی اضافه کنید:

حالا سه متغیر زیر را تعریف کنید:

و در نهایت، کنترل‌های UI را تعریف کنید:


پیاده‌سازی onCreate اکتیویتی:

بیایید ببینیم در onCreate برای شروع چه باید نوشت؟! آن را به صورت زیر تکمیل کنید:

شرح کد:

  1. متغیرهای mSignInButton (دکمه ورود)، mSignOutButton (دکمه خروج)، mRevokeButton (دکمه ابطال کامل و خروج) و mStatus (وضعیت فعلی) را مقداردهی می‌کنیم.
  2. برای همه‌ی دکمه‌ها، رویداد کلیک اینترفیس View.OnClickListener که در اکتنیویتی پیاده شده است را تنظیم می‌کنیم.
  3. mGoogleApiClient را که برای برقراری ارتباط با سرویس Play گوگل است، توسط متد buildGoogleApiClient مقداردهی می‌کنیم.

متد buildGoogleApiClient:

این متد که خودمان آن را پیاده می‌کنیم، یک آبجکت (GoogleApiClient) جدیدی جهت اتصال به API سرویس گوگل، با تنظیمات دلخواهمان تولید کرده و برایمان برمی‌گرداند.

شرح GoogleApiClient:

  • متد سازنده‌: یک Context دریافت می‌کند.
  • متد addConnectionCallbacks: اینترفیس ConnectionCallbacks دریافت می‌کند؛ که در اینجا، اینترفیس پیاده‌شده روی اکتیویتی را در نظر گرفته‌ایم. و همچنین این اینترفیس، دو متد onConnected و onConnectionSuspended را شامل می‌شود:
    onConnected: وقتی به سرویس گوگل متصل شود.
    onConnectionSuspended: وقتی وضعیت انصال معلق شود.
  • متد addOnConnectionFailedListener: اینترفیس OnConnectionFailedListener دریافت می‌کند؛ که در اینجا، اینترفیس پیاده‌شده روی اکتیویتی را در نظر گرفته‌ایم. و همچنین این اینترفیس، تنها شامل متد onConnectionFailed می‌باشد؛ که در هنگام ناموفق بودن ارتباط، اجرا می‌شود.
  • متد addApi: برای مشخص کردن API مورد نیاز به کار می‌رود؛ که در اینجا، گوگل پلاس مورد نیاز ماست!
  • متد addScope: برای مشخص کردن اطلاعات درخواستی می‌باشد. مثلا در اینجا، تنها به ایمیل نیاز داریم؛ که می‌توان بعدا به جنسیت و … نیز اشاره کرد.

پیاده‌سازی متدهای onStart() و onStop() خود اکتیویتی:

در هنگام شروع اکتیویتی، کلاینت را به سرویس گوگل متصل کرده و در هنگام توقف اکتیویتی، ارتباط را قطع می‌کنیم.

توجه
این اتصال، فقط اتصال به سرویس گوگل بوده و هنوز کاربر لاگین نشده است!

مدیریت رویداد معلق شدن:

در صورت معلق شدن، دوباره سعی کن متصل شوی!


مدیریت رویداد onConnected:

این رویداد، قرار است که پس از کلیک روی دکمه‌‎ی Sign in و در صورت موفق بودن اتصال، اجرا شود.

شرح کد:

  1. زمانی که متصل شد، دکمه‌ی Sign in غیرفعال شده و دو دکمه‌ی دیگر فعال شوند.
  2. به کمک متغیر mSignInProgress و ثابت‌هایی که نوشته‌ایم، مشخص می‌کنیم که در حال حاظر، وصعبت sign in کاربر در مرحله‌ی ورود کامل (SIGNED_IN) قرار دارد.
  3. آدرس ایمیل را از پلاس دریافت کرده و سپس درون mStatus پیامی را نمایش می‌دهیم! همچنین ممکن است خطایی رخ دهده که آن را هم مدیریت کرده‌ایم.
    این مورد نیاز به مجوز GET_ACCOUNTS دارد؛ وگرنه خطا رخ می‌دهد.

مدیریت رویداد onConnectionFailed:

این رویداد، معمولا در صورت وجود مشکل در اتصال اجرا می‌شود.

شرح کد:

اگر وضعیت ورود به حساب، در حال پردازش نبود (که این وضعیت را در ادامه خواهیم دید)، در این صورت، از ورودی ConnectionResult دریافت شده در داخل رویداد، PendingIntent را به دست آورده و سپس resolveSignInError را اجرا می‌کنیم (متدی برای حل ارور ورود به حساب که در ادامه می‌نویسیم)! و در نهایت، متد onSignedOut (رویدادی که قرار است موقع Sign Out شدن فراخوانی شود) را اجرا می‌کنیم. این متد یک متد شخصی است که در ادامه آن را پیاده خواهیم کرد. البته خود onConnectionFailed نیز حکم Sign Out را دارد؛ ولی چون بررسی دیگری نیز درون آن انجام داده‌ایم، متد دیگری برای رویداد Sign Out تعریف کرده‌ایم تا منطق بهتری داشته باشد.


متد resolveSignInError:

شرح کد:

اگر mSignInIntent مقداردهی شده باشد، یعنی در وضعیت sign in قرار داد و خطایی رخ داده است؛ پس ابتدا وضعیت ورود را به در حال پردازش تغییر داده و سپس یک دیالوگی به کاربر نمایش می‌دهیمکه اکانت مورد نظر را برای لاگین شدن انتخاب کند. و جواب آن در رویداد onActivityResult برگردانده می‌شود. request code را نیز برابر RC_SIGN_IN قرار داده‌ایم.

اما اگر mSignInIntent خالی بود، یعنی خطا از طرف خود سرویس گوگل است؛ که البته در کد بالا، برای آن پیاده‌‎سازی خاصی انجام ندادیم.


پیاده‌سازی onActivityResult:

شرح کد:

اگر نتیجه (requestCode) برابر RC_SIGN_IN بود، و در صورتی که resultCode برابر RESULT_OK بود، حالت وضعیت فعلی را به STATE_SIGNING_IN (در حال اتصال) تغییر بده؛ در غیر این صورت، آن را به SIGNED_IN (متصل شده) تغییر بده.

و در ادامه بررسی می‌کنیم که اگر در حال اتصال به سروریس گوگل نبود، یک اتصال جدید صورت گیرد. دقت کنید که در حال اتصال را بررسی میکنیم نه این که آیا متصل شده است یا خیر!


پیاده‌سازی متد onSignedOut:

این متد، در زمانی که Sign Out رخ داده و از حساب خارح شده باشد، رخ می‌دهد. آن را در بالا و داخل onConnectionFailed فراخوانی کردیم.


پیاده سازی متد onClick:

حالا بیایید مشخص کنیم که وقتی روی دکمه‌ها کلیک شد چه رخ دهد!

شرح کد:

  • اگر روی هرکدام از دکمه‌های ورود، خروج و معلق کلیک شد؛ ولی هنوز کلاینت به سرور گوگل متصل نشده بود، هیچ اتفاقی رخ ندهد.
  • اگر روی ورود به حساب کلیک شد:
    پیام “Signing In” (در حال ورود) را در mStatus به کاربر نمایش دهد.
    متد resolveSignInError اجرا شود. (این متد در بالا توضیح داده شد)
    در واقع در اولین اجرای برنامه، onConnectionFailed رخ خواهد داد و mSignInIntent نیز مقداردهی می‌شود؛ لذا با اجرای resolveSignInError، دیالوگ انتخاب حساب کاربری جهت اتصال به آن نمایش داده می‌شود.
  • اگر روی خروج از حساب کلیک شد:
    کلاینت فعلی توسط Plus.AccountApi.clearDefaultAccount پاکسازی شود.
    متد disconnect اجرا شود.
  • اگر روی ابطال کلیک شد: (ابطال کامل کلاینت ایجاد شده)
    کلاینت فعلی توسط Plus.AccountApi.clearDefaultAccount پاکسازی شود.
    دسترسی را ابطال کرده و از حساب خارج شود.
    یک کلاینت جدید از ابتدا بسازد و به آن متصل شود.

برنامه آماده اجرا است! به همین سادگی.

تبلیغات
0
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه ?)

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه