لینک کردن حساب گوگل با OAuth (Implicit Flow - بایگانی‌شده)

برای پشتیبانی از جریان ضمنی OAuth 2.0، سرویس شما یک نقطه پایانی مجوزدهی را از طریق HTTPS در دسترس قرار می‌دهد. این نقطه پایانی مسئول احراز هویت و اخذ رضایت از کاربران برای دسترسی به داده‌ها است. نقطه پایانی مجوزدهی، یک رابط کاربری ورود به سیستم را به کاربرانی که هنوز وارد سیستم نشده‌اند، ارائه می‌دهد و رضایت آنها را برای دسترسی درخواستی ثبت می‌کند.

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

لینک کردن حساب گوگل: جریان ضمنی OAuth

نمودار توالی زیر، جزئیات تعاملات بین کاربر، گوگل و نقاط پایانی سرویس شما را نشان می‌دهد.

کاربر اپلیکیشن گوگل / مرورگر مجوز شما نقطه پایانی ۱. کاربر پیوند را آغاز می‌کند ۲. ریدایرکت به Auth Endpoint (GET) client_id، redirect_uri، وضعیت، دامنه ۳. نمایش صفحه ورود و رضایت‌نامه ۴. احراز هویت کاربر و اعطای رضایت ۵. با استفاده از توکن (GET) به گوگل ریدایرکت شوید access_token، وضعیت ۶. ذخیره توکن‌های کاربر ۷. دسترسی به منابع کاربر
شکل ۱. توالی رویدادها در جریان ضمنی OAuth 2.0 برای پیوند دادن حساب گوگل.

نقش‌ها و مسئولیت‌ها

جدول زیر نقش‌ها و مسئولیت‌های بازیگران در جریان ضمنی OAuth لینکینگ حساب گوگل (GAL) را تعریف می‌کند. توجه داشته باشید که در GAL، گوگل به عنوان کلاینت OAuth عمل می‌کند، در حالی که سرویس شما به عنوان ارائه‌دهنده هویت/سرویس عمل می‌کند.

بازیگر / جزء نقش GAL مسئولیت‌ها
برنامه/سرور گوگل کلاینت OAuth جریان را آغاز می‌کند، توکن دسترسی را با استفاده از تغییر مسیر مرورگر دریافت می‌کند و آن را به صورت ایمن برای دسترسی به APIهای سرویس شما ذخیره می‌کند.
نقطه پایانی مجوز شما سرور احراز هویت کاربران شما را احراز هویت می‌کند، رضایت آنها را دریافت می‌کند و توکن‌های دسترسی بلندمدت را مستقیماً برای گوگل صادر می‌کند.
آدرس اینترنتی ریدایرکت گوگل نقطه پایانی پاسخ به تماس تغییر مسیر کاربر را از سرویس احراز هویت شما به همراه مقادیر access_token و state در قطعه URL دریافت می‌کند.

یک جلسه جریان ضمنی OAuth 2.0 معمولی که توسط گوگل آغاز می‌شود، جریان زیر را دارد:

  1. گوگل نقطه پایانی مجوز شما را در مرورگر کاربر باز می‌کند. کاربر، اگر قبلاً وارد سیستم نشده باشد، وارد سیستم می‌شود و اگر قبلاً اجازه نداده باشد، به گوگل اجازه دسترسی به داده‌هایش با API شما را می‌دهد.
  2. سرویس شما یک توکن دسترسی ایجاد می‌کند و آن را به گوگل برمی‌گرداند. برای انجام این کار، مرورگر کاربر را به همراه توکن دسترسی متصل به درخواست، به گوگل هدایت کنید.
  3. گوگل APIهای سرویس شما را فراخوانی می‌کند و توکن دسترسی را به هر درخواست پیوست می‌کند. سرویس شما تأیید می‌کند که توکن دسترسی، مجوز دسترسی به API را به گوگل می‌دهد و سپس فراخوانی API را تکمیل می‌کند.

دستور العمل اجرا

برای پیاده‌سازی جریان ضمنی، این مراحل را دنبال کنید.

مرحله ۱: رسیدگی به درخواست‌های مجوز

وقتی گوگل اتصال حساب را آغاز می‌کند، کاربر را به نقطه پایانی مجوز شما هدایت می‌کند. برای جزئیات قراردادهای پروتکل و الزامات پارامتر، به نقطه پایانی مجوز مراجعه کنید.

برای مدیریت درخواست، اقدامات زیر را انجام دهید:

  1. اعتبارسنجی درخواست :

    • تأیید کنید که client_id با Client ID اختصاص داده شده به گوگل مطابقت دارد.
    • تأیید کنید که redirect_uri با آدرس اینترنتی ریدایرکت مورد انتظار گوگل مطابقت دارد: none https://oauth-redirect.googleusercontent.com/r/YOUR_PARTNER_ID https://oauth-redirect-sandbox.googleusercontent.com/r/YOUR_PARTNER_ID
    • تأیید کنید که response_type token باشد.
  2. احراز هویت کاربر :

    • بررسی کنید که آیا کاربر به سرویس شما وارد شده است یا خیر.
    • اگر کاربر وارد سیستم نشده است، از او بخواهید مراحل ورود یا ثبت‌نام شما را تکمیل کند.
  3. تولید توکن دسترسی :

    • یک توکن دسترسی منحصر به فرد و غیرقابل حدس مرتبط با کاربر و کلاینت ایجاد کنید.
  4. ریدایرکت مجدد به گوگل :

    • مرورگر را به URL ارائه شده در redirect_uri هدایت کنید.
    • پارامترهای زیر را در قطعه URL (هش) اضافه کنید:
      • access_token : توکن دسترسی که ایجاد کرده‌اید.
      • token_type : باید bearer باشد.
      • state : مقدار وضعیت اصلاح نشده‌ای که از گوگل دریافت شده است.
处理 userinfo 请求

userinfo 端点是受 OAuth 2.0 保护的资源,会返回关联用户的声明。实现和托管 userinfo 端点是可选的,但以下用例除外:

从您的令牌端点成功检索到访问令牌后,Google 会向您的 userinfo 端点发送请求,以检索关联用户的基本个人资料信息。

userinfo 端点请求标头
Authorization header Bearer 类型的访问令牌。

例如,如果您的 userinfo 端点可通过 https://myservice.example.com/userinfo 时,请求可能如下所示:

GET /userinfo HTTP/1.1
Host: myservice.example.com
Authorization: Bearer ACCESS_TOKEN

为了让 userinfo 端点能够处理请求,请执行以下步骤:

  1. 从 Authorization 标头中提取访问令牌,并返回与访问令牌相关联的用户的信息。
  2. 如果访问令牌无效,则使用 WWW-Authenticate 响应标头返回 HTTP 401 Unauthorized 错误。下面是一个 userinfo 错误响应示例:
    HTTP/1.1 401 Unauthorized
    WWW-Authenticate: error="invalid_token",
    error_description="The Access Token expired"
    
    如果在关联过程中返回 401 未经授权错误或任何其他失败的错误响应,该错误将无法恢复,检索到的令牌将被舍弃,并且用户必须重新开始关联流程。
  3. 如果访问令牌有效,则返回 HTTPS 正文中包含以下 JSON 对象的 HTTP 200 响应 回答:

    {
    "sub": "USER_UUID",
    "email": "EMAIL_ADDRESS",
    "given_name": "FIRST_NAME",
    "family_name": "LAST_NAME",
    "name": "FULL_NAME",
    "picture": "PROFILE_PICTURE",
    }
    如果您的 userinfo 端点返回 HTTP 200 成功响应,则系统会针对用户的 Google 账号注册检索到的令牌和声明。

    userinfo 端点响应
    sub 系统中用于识别用户的唯一 ID。
    email 用户的电子邮件地址。
    given_name 可选:用户的名字。
    family_name 可选:用户的姓氏。
    name 可选:用户的全名。
    picture 可选:用户的个人资料照片。