یک راه حل هویت را با FedCM در سمت حزب متکی اجرا کنید

طرف‌های ذینفع (RP) برای فعال کردن FedCM در سایت خود باید مراحل زیر را انجام دهند:

با FedCM API در طرف اعتماد تماس بگیرید

پس از اینکه پیکربندی و نقاط پایانی IdP در دسترس قرار گرفتند، RPها می‌توانند navigator.credentials.get() را فراخوانی کنند تا درخواست کنند که به کاربر اجازه ورود به RP با IdP داده شود.

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

  if ('IdentityCredential' in window) {
    // If the feature is available, take action
  } else {
    // FedCM is not supported, use a different identity solution
  }

برای اینکه به یک کاربر اجازه داده شود تا با استفاده از FedCM در RP به IdP وارد شود، RP می‌تواند navigator.credentials.get() را فراخوانی کند. از کروم ۱۳۶، RP می‌تواند با مشخص کردن آرایه‌ای از چندین ارائه‌دهنده هویت در یک فراخوانی navigator.credentials.get() از چندین IdP پشتیبانی کند، برای مثال:

  const credential = await navigator.credentials.get({
      identity: {
        // Specify the IdP (or multiple IdPs, supported from Chrome 136) this Relying Party supports
        providers: [
        {
              configURL: 'https://accounts.idp-1.example/config.json',
              clientId: '********'
        },
        {
          configURL: 'https://accounts.idp-2.example/config.json',
          clientId: '********'
        }]
      }
    },
  );
  const { token } = credential;

  // Get the current IdP's configURL to identify which provider the user is signed in with
  const currentIdpConfigUrl = credential.configURL;
  if (currentIdpConfigUrl === 'https://idp1.example/foo.json') {
    // handle the case where the user signed in with idp1
  } else if (currentIdpConfigUrl === 'https://idp2.example/bar.json') {
    // handle the case where the user signed in with idp2
    }

با ورود به سیستم با IdP1 و IdP2 ، ویژگی IdP های چندگانه را امتحان کنید.

ویژگی زمینه

با استفاده از ویژگی اختیاری context ، RP می‌تواند رشته موجود در رابط کاربری دیالوگ FedCM را تغییر دهد (برای مثال، "Sign in to rp.example…"، "Use idp.example…") تا زمینه‌های احراز هویت از پیش تعریف شده را در خود جای دهد. ویژگی context می‌تواند مقادیر زیر را داشته باشد:

  • signin (پیش‌فرض)
  • signup
  • use
نموداری که اجزای رابط کاربری پنجره FedCM را توضیح می‌دهد: در سمت چپ بالا، یک آیکون نمایش داده می‌شود. در سمت راست آیکون، یک کامپوننت متنی وجود دارد که پیام «ورود به RP با IdP» را نمایش می‌دهد. در پایین، دکمه «ادامه» با متن و رنگ پس‌زمینه دلخواه قرار دارد.
نحوه اعمال برندسازی در پنجره گفتگوی FedCM

برای مثال، تنظیم context برای use ، پیام زیر را در پی خواهد داشت:

یک پنجره‌ی محاوره‌ای FedCM که یک پیام متنی سفارشی‌شده را نمایش می‌دهد: به جای «ورود» با FedCM، پیام متنی می‌گوید «استفاده» از FedCM.
پنجره‌ی FedCM یک پیام متنی سفارشی‌شده را نمایش می‌دهد.

مرورگر، بسته به وجود approved_clients در پاسخ از نقطه پایانی لیست حساب‌ها، موارد استفاده ثبت نام و ورود را به طور متفاوتی مدیریت می‌کند. اگر کاربر قبلاً در RP ثبت نام کرده باشد، مرورگر متن افشای اطلاعات "برای ادامه با ...." را نمایش نمی‌دهد.

ویژگی providers آرایه‌ای از اشیاء IdentityProvider را می‌گیرد که دارای ویژگی‌های زیر هستند:

ملک ارائه دهندگان

ویژگی providers آرایه‌ای از اشیاء IdentityProvider را می‌گیرد که دارای ویژگی‌های زیر هستند:

ملک توضیحات
configURL (الزامی) مسیر کامل فایل پیکربندی IdP.
clientId (الزامی) شناسه‌ی کلاینتِ RP، صادر شده توسط IdP.
loginHint (اختیاری) با مشخص کردن یکی از مقادیر login_hints ارائه شده توسط نقاط انتهایی حساب‌ها ، کادر محاوره‌ای FedCM به صورت انتخابی حساب مشخص شده را نمایش می‌دهد.
domainHint (اختیاری) با مشخص کردن یکی از مقادیر domain_hints ارائه شده توسط نقاط انتهایی حساب‌ها ، کادر محاوره‌ای FedCM به صورت انتخابی حساب مشخص شده را نمایش می‌دهد.
mode (اختیاری) رشته‌ای که حالت رابط کاربری FedCM را مشخص می‌کند. می‌تواند یکی از مقادیر زیر را داشته باشد:
  • "active" : اعلان FedCM باید با تعامل کاربر (مانند کلیک روی یک دکمه) آغاز شود.
  • "passive" : اعلان FedCM بدون تعامل مستقیم کاربر آغاز می‌شود.
برای کسب اطلاعات بیشتر در مورد تفاوت بین حالت‌های فعال و غیرفعال، به صفحه مرور کلی مراجعه کنید.

توجه: پارامتر mode از کروم ۱۳۲ پشتیبانی می‌شود.
fields (اختیاری) آرایه‌ای از رشته‌ها که اطلاعات کاربری را که RP برای اشتراک‌گذاری با IdP به آن نیاز دارد، مشخص می‌کند. فیلدهای زیر می‌توانند به صورت اختیاری مشخص شوند:
  • "name"
  • "username"
  • "email"
  • "tel"
  • "picture"
نکته: رابط برنامه‌نویسی کاربردی فیلدها (Fields API) توسط کروم ۱۳۲ و بالاتر پشتیبانی می‌شود. فیلدهای "username" و "tel" از کروم ۱۴۱ پشتیبانی می‌شوند.
params (اختیاری) شیء سفارشی که امکان تعیین پارامترهای کلید-مقدار اضافی را فراهم می‌کند:
  • scope : یک مقدار رشته‌ای حاوی مجوزهای اضافی که RP باید درخواست کند، برای مثال "drive.readonly calendar.readonly"
  • nonce : یک رشته تصادفی برای اطمینان از اینکه پاسخ برای این درخواست خاص صادر می‌شود. از حملات بازپخش جلوگیری می‌کند.
  • سایر پارامترهای کلید-مقدار سفارشی.

نکته: params از کروم ۱۳۲ پشتیبانی می‌شود.

حالت فعال

FedCM از پیکربندی‌های مختلف حالت UX پشتیبانی می‌کند. حالت غیرفعال، حالت پیش‌فرض است و توسعه‌دهندگان نیازی به پیکربندی آن ندارند.

برای استفاده از FedCM در حالت فعال:

  1. بررسی در دسترس بودن ویژگی در مرورگر کاربر.
  2. API را با یک حرکت گذرای کاربر، مانند کلیک روی دکمه، فراخوانی کنید.
  3. پارامتر mode را به فراخوانی API ارسال کنید:
  let supportsFedCmMode = false;
  try {
    navigator.credentials.get({
      identity: Object.defineProperty(
        // Check if this Chrome version supports the Mode API.
        {}, 'mode', {
          get: function () { supportsFedCmMode = true; }
        }
      )
    });
  } catch(e) {}

  if (supportsFedCmMode) {
    // The button mode is supported. Call the API with mode property:
    return await navigator.credentials.get({
      identity: {
        providers: [{
          configURL: 'https://idp.example/config.json',
          clientId: '123',
        }],
        // The 'mode' value defines the UX mode of FedCM.
        // - 'active': Must be initiated by user interaction (e.g., clicking a button).
        // - 'passive': Can be initiated without direct user interaction.
        mode: 'active'
      }
    });
  }

حالت فعال را با این نسخه آزمایشی امتحان کنید.

آیکون سفارشی در حالت فعال

حالت فعال به IdPها اجازه می‌دهد تا نماد لوگوی رسمی RP را مستقیماً در پاسخ فراداده نقطه پایانی کلاینت قرار دهند. RP باید داده‌های برند خود را از قبل ارائه دهد.

فراخوانی FedCM از درون یک iframe با مبدا متقابل

FedCM می‌تواند از درون یک iframe با مبدا متقابل با استفاده از سیاست مجوزهای identity-credentials-get فراخوانی شود، البته اگر فریم والد اجازه دهد. برای انجام این کار، ویژگی allow="identity-credentials-get" به صورت زیر به تگ iframe اضافه کنید:

  <iframe src="https://fedcm-cross-origin-iframe.glitch.me" allow="identity-credentials-get"></iframe>

می‌توانید آن را در عمل در یک مثال ببینید.

به صورت اختیاری، اگر فریم والد بخواهد مبداها را برای فراخوانی FedCM محدود کند، یک سرصفحه Permissions-Policy با لیستی از مبداهای مجاز ارسال کنید.

  Permissions-Policy: identity-credentials-get=(self "https://fedcm-cross-origin-iframe.glitch.me")

می‌توانید در بخش «کنترل ویژگی‌های مرورگر با سیاست مجوزها» درباره نحوه عملکرد سیاست مجوزها بیشتر بدانید.

API راهنمای ورود

با استفاده از راهنمای ورود، RP می‌تواند به کاربر توصیه کند که با کدام حساب کاربری وارد سیستم شود. این می‌تواند برای تأیید مجدد هویت کاربرانی که مطمئن نیستند قبلاً از کدام حساب کاربری استفاده کرده‌اند، مفید باشد.

RPها می‌توانند با فراخوانی navigator.credentials.get() به همراه ویژگی loginHint و یکی از مقادیر login_hints که از نقطه پایانی لیست حساب‌ها واکشی شده است، به صورت انتخابی یک حساب کاربری خاص را نمایش دهند، همانطور که در نمونه کد زیر نشان داده شده است:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: '123',
        // Accounts endpoint can specify a 'login_hints' array for an account.
        // When RP specifies a 'exampleHint' value, only those accounts will be
        // shown to the user whose 'login_hints' array contains the 'exampleHint'
        // value
        loginHint : 'exampleHint'
      }]
    }
  });

وقتی هیچ حسابی با loginHint مطابقت نداشته باشد، پنجره‌ی FedCM یک اعلان ورود به سیستم نشان می‌دهد که به کاربر اجازه می‌دهد به یک حساب IdP که با hint درخواستی RP مطابقت دارد، وارد شود. وقتی کاربر روی prompt ضربه می‌زند، یک پنجره‌ی گفتگو با URL ورود مشخص شده در فایل پیکربندی باز می‌شود. سپس لینک با hint ورود و پارامترهای کوئری domain hint اضافه می‌شود.

API راهنمای دامنه

RPها می‌توانند به صورت انتخابی فقط حساب‌های مرتبط با یک دامنه خاص را نشان دهند. این می‌تواند برای RPهایی که محدود به یک دامنه شرکتی هستند مفید باشد.

برای نمایش فقط حساب‌های دامنه خاص، RP باید navigator.credentials.get() با ویژگی domainHint و یکی از مقادیر domain_hints که از نقطه پایانی لیست حساب‌ها واکشی شده است، فراخوانی کند، همانطور که در نمونه کد زیر نشان داده شده است:

  return await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/manifest.json',
        clientId: 'abc',
        // Accounts endpoint can specify a 'domain_hints' array for an account.
        // When RP specifies a '@domain.example' value, only those accounts will be
        // shown to the user whose 'domain_hints' array contains the
        // '@domain.example' value
        domainHint : '@domain.example'
      }]
    }
  });

وقتی هیچ حسابی با domainHint مطابقت نداشته باشد، پنجره‌ی FedCM یک اعلان ورود به سیستم نشان می‌دهد که به کاربر اجازه می‌دهد به یک حساب IdP که با hint درخواستی RP مطابقت دارد، وارد شود. وقتی کاربر روی prompt ضربه می‌زند، یک پنجره‌ی گفتگو با URL ورود مشخص شده در فایل پیکربندی باز می‌شود. سپس لینک با hint ورود و پارامترهای query hint دامنه اضافه می‌شود.

یک نمونه درخواست ورود به سیستم زمانی که هیچ حسابی با domainHint مطابقت ندارد.
یک نمونه درخواست ورود به سیستم زمانی که هیچ حسابی با domainHint مطابقت ندارد.

برای جزئیات بیشتر، نسخه آزمایشی (دمو) را بررسی کنید.

پارامترهای سفارشی

ویژگی پارامترهای سفارشی به RP اجازه می‌دهد تا پارامترهای کلید-مقدار اضافی را به نقطه پایانی ادعای شناسه ارائه دهد. با استفاده از API پارامترها، RPها می‌توانند پارامترهای اضافی را به IdP ارسال کنند تا مجوزهایی فراتر از ورود اولیه به سیستم را درخواست کنند. ارسال پارامترهای اضافی می‌تواند در این سناریوها مفید باشد:

  • RP باید مجوزهای اضافی را که IdP دارد، مانند آدرس صورتحساب یا دسترسی به تقویم، به صورت پویا درخواست کند. کاربر می‌تواند این مجوزها را از طریق یک جریان UX کنترل‌شده توسط IdP که با استفاده از ویژگی Continue on راه‌اندازی می‌شود، تأیید کند و IdP سپس این اطلاعات را به اشتراک می‌گذارد.

برای استفاده از API، RP پارامترهایی را به عنوان یک شیء در فراخوانی navigator.credentials.get() به ویژگی params اضافه می‌کند:

  let {token} = await navigator.credentials.get({
    identity: {
      providers: [{
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
        // Key/value pairs that need to be passed from the
        // RP to the IdP but that don't really play any role with
        // the browser.
        params: {
          IDP_SPECIFIC_PARAM: '1',
          foo: 'BAR'
        }
      },
    }
  });

مرورگر به طور خودکار این را به یک درخواست POST به IdP با پارامترهایی به عنوان یک شیء سریالی شده JSON با رمزگذاری url تبدیل می‌کند:

  // The assertion endpoint is drawn from the config file
  POST /fedcm_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  // params are translated into urlencoded version of `{"IDP_SPECIFIC_PARAM":"1","foo":"bar"}`
  account_id=123&client_id=client1234&params=%22%7B%5C%22IDP_SPECIFIC_PARAM%5C%22%3A1%2C%5C%22foo%5C%22%3A%5C%22BAR%5C%22%7D%22.

اگر RP به مجوزهای اضافی نیاز داشته باشد، IdP می‌تواند یک لینک تغییر مسیر ارائه دهد. برای مثال، در node.js:

  if (rpRequestsPermissions) {
    // Response with a URL if the RP requests additional permissions
    return res.json({
      continue_on: '/example-redirect',
    });
  }

فیلدها

RP می‌تواند اطلاعات کاربری مورد نیاز خود را که IdP باید با او به اشتراک بگذارد، مشخص کند. این می‌تواند شامل هر ترکیبی از نام، آدرس ایمیل، نام کاربری، شماره تلفن و تصویر پروفایل باشد. اطلاعات درخواستی در رابط کاربری افشای اطلاعات در پنجره گفتگوی FedCM گنجانده خواهد شد.

کاربرانی که ثبت‌نام می‌کنند پیامی را مشاهده خواهند کرد که به آنها اطلاع می‌دهد در صورت تمایل کاربر به ثبت‌نام، idp.example اطلاعات درخواستی را با rp.example به اشتراک خواهد گذاشت. اگر پاسخ از نقطه پایانی حساب‌ها شامل فیلدی نباشد که RP درخواست کرده است، متن افشا شامل این فیلد نخواهد بود. IdP تمام فیلدهای درخواستی را از نقطه پایانی ادعای شناسه دریافت می‌کند و تصمیم می‌گیرد که آیا باید مجوز کاربر بیشتری برای ادامه کار جمع‌آوری کند یا خیر.

کادر محاوره‌ای FedCM شامل متن رابط کاربری افشای اطلاعات زیر: «برای ادامه، fedcm-idp-demo.localhost نام کاربری و شماره تلفن شما را با این سایت به اشتراک خواهد گذاشت.»
پیام افشا: RP از IdP درخواست می‌کند که فقط نام کاربری و شماره تلفن را به اشتراک بگذارد.

برای استفاده از ویژگی Fields، RP باید یک آرایه fields در فراخوانی navigator.credentials.get() اضافه کند. فیلدها می‌توانند شامل ویژگی‌هایی مانند name ، email ، tel ، username یا picture باشند. این می‌تواند در آینده برای شامل شدن مقادیر بیشتر گسترش یابد. یک درخواست با fields به این شکل خواهد بود:

   let { token } = await navigator.credentials.get({
    identity: {
      providers: [{
        // RP requests the IdP to share only username and profile picture
        fields: [ 'username', 'picture'],
        clientId: '1234',
        configURL: 'https://idp.example/fedcm.json',
      },
    }
  });

مرورگر به طور خودکار آن را به یک درخواست HTTP به نقطه پایانی ادعای شناسه که شامل پارامتر fields مشخص شده توسط RP است، ترجمه می‌کند و فیلدهایی را که مرورگر در پارامتر disclosure_shown_for به کاربر فاش کرده است، نمایش می‌دهد. برای سازگاری با نسخه‌های قبلی، مرورگر همچنین در صورتی که متن افشا نشان داده شده باشد و فیلدهای درخواستی شامل هر سه فیلد 'name' ، 'email' و 'picture' باشند، disclosure_text_shown=true ارسال می‌کند. از کروم ۱۴۱، مقدار disclosure_text_shown نشان نمی‌دهد که آیا متن افشا واقعاً به کاربر نمایش داده شده است یا خیر.

  POST /id_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  // The RP only requested to share email and picture. The browser will send `disclosure_text_shown=false`, as the 'name' field value is missing
  account_id=123&client_id=client1234&disclosure_text_shown=false&fields=email,picture&disclosure_shown_for=email,picture

اگر fields یک آرایه خالی باشد، مرورگر از رابط کاربری افشا صرف نظر می‌کند.

یک پنجره محاوره‌ای حالت غیرفعال FedCM که پیام رابط کاربری افشا را نمایش نمی‌دهد.
پیام افشا در حالت غیرفعال نمایش داده نمی‌شود. در جریان دکمه، رابط کاربری افشا به طور کامل نادیده گرفته می‌شود.

این مورد حتی اگر پاسخ از نقطه پایانی حساب‌ها حاوی شناسه کلاینتی نباشد که با RP در approved_clients مطابقت داشته باشد، صادق است.

در این حالت، disclosure_text_shown ارسال شده به نقطه پایانی ادعای شناسه در بدنه HTTP نادرست است:

  POST /id_assertion_endpoint HTTP/1.1
  Host: idp.example
  Origin: https://rp.example/
  Content-Type: application/x-www-form-urlencoded
  Cookie: 0x23223
  Sec-Fetch-Dest: webidentity

  account_id=123&client_id=client1234&nonce=234234&disclosure_text_shown=false

نمایش پیام خطا

گاهی اوقات، ممکن است IdP به دلایل موجهی، مانند زمانی که کلاینت غیرمجاز است یا سرور موقتاً در دسترس نیست، نتواند توکن صادر کند. اگر IdP پاسخ "خطا" را برگرداند، RP می‌تواند آن را دریافت کند و Chrome می‌تواند با نمایش رابط کاربری مرورگر با اطلاعات خطای ارائه شده توسط IdP، به کاربر اطلاع دهد.

یک کادر محاوره‌ای FedCM که پیام خطا را پس از تلاش ناموفق کاربر برای ورود به سیستم نشان می‌دهد. رشته‌ی مربوطه به نوع خطا مرتبط است.
یک کادر محاوره‌ای FedCM که پیام خطا را پس از تلاش ناموفق کاربر برای ورود به سیستم نشان می‌دهد. رشته با نوع خطا مرتبط است.
  try {
    const cred = await navigator.credentials.get({
      identity: {
        providers: [
          {
            configURL: 'https://idp.example/manifest.json',
            clientId: '1234',
          },
        ],
      }
    });
  } catch (e) {
    const code = e.code;
    const url = e.url;
  }

احراز هویت مجدد خودکار کاربران پس از احراز هویت اولیه

احراز هویت مجدد خودکار FedCM (به اختصار "احراز هویت خودکار") می‌تواند به کاربران اجازه دهد تا به طور خودکار احراز هویت مجدد شوند. برای احراز هویت مجدد خودکار کاربر، شرایط زیر باید رعایت شود:

  • کاربر قبلاً احراز هویت اولیه را با استفاده از FedCM انجام داده است. «احراز هویت اولیه» در اینجا به این معنی است که کاربر یک حساب کاربری ایجاد می‌کند یا با ضربه زدن روی دکمه «ادامه به عنوان...» در پنجره ورود به سیستم FedCM برای اولین بار در همان مرورگر، وارد وب‌سایت RP می‌شود.
  • کاربر فقط یک حساب کاربری برگشتی دارد. اگر حساب‌های کاربری برگشتی برای چندین IdP وجود داشته باشد، کاربر به طور خودکار دوباره احراز هویت نخواهد شد.

اگرچه تجربه کاربری صریح قبل از اینکه کاربر حساب کاربری فدرال را برای جلوگیری از ردیابی ایجاد کند (که یکی از اهداف اصلی FedCM است) منطقی به نظر می‌رسد، اما پس از اینکه کاربر یک بار آن را انجام داد، به طور غیرضروری دست و پا گیر می‌شود: پس از اینکه کاربر اجازه برقراری ارتباط بین RP و IdP را اعطا کرد، هیچ مزیت امنیتی یا حریم خصوصی برای اجرای تأیید صریح کاربر دیگری برای چیزی که قبلاً آن را تأیید کرده است، وجود ندارد.

با احراز هویت خودکار، مرورگر بسته به گزینه‌ای که هنگام فراخوانی navigator.credentials.get() برای mediation مشخص می‌کنید، رفتار خود را تغییر می‌دهد.

  const cred = await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/fedcm.json',
        clientId: '1234',
      }],
    },
    mediation: 'optional', // this is the default
  });

  // `isAutoSelected` is `true` if auto-reauthn was performed.
  const isAutoSelected = cred.isAutoSelected;

mediation یک ویژگی در API مدیریت اعتبارنامه است، رفتاری مشابه با PasswordCredential و FederatedCredential دارد و تا حدی توسط PublicKeyCredential نیز پشتیبانی می‌شود. این ویژگی چهار مقدار زیر را می‌پذیرد:

  • 'optional' (پیش‌فرض): در صورت امکان، احراز هویت خودکار و در غیر این صورت، نیاز به میانجیگری دارد. توصیه می‌کنیم این گزینه را در صفحه ورود انتخاب کنید.
  • 'required' : همیشه برای ادامه نیاز به میانجیگری دارد، مثلاً کلیک روی دکمه «ادامه» در رابط کاربری. اگر از کاربرانتان انتظار می‌رود هر بار که نیاز به احراز هویت دارند، صریحاً مجوز بدهند، این گزینه را انتخاب کنید.
  • 'silent' : در صورت امکان، احراز هویت خودکار و در غیر این صورت، بدون نیاز به میانجیگری، به صورت بی‌صدا از کار می‌افتد. توصیه می‌کنیم این گزینه را در صفحاتی غیر از صفحه ورود اختصاصی انتخاب کنید، اما در جایی که می‌خواهید کاربران را در حالت ورود نگه دارید - به عنوان مثال، صفحه کالا در یک وب‌سایت حمل و نقل یا صفحه مقاله در یک وب‌سایت خبری.
  • 'conditional' : برای WebAuthn استفاده می‌شود و در حال حاضر برای FedCM در دسترس نیست.

با این فراخوانی، احراز هویت خودکار تحت شرایط زیر اتفاق می‌افتد:

وقتی این شرایط برآورده شوند، به محض فراخوانی تابع navigator.credentials.get() از FedCM، تلاش برای احراز هویت مجدد خودکار کاربر آغاز می‌شود.

وقتی mediation: optional ، ممکن است احراز هویت خودکار به دلایلی که فقط مرورگر می‌داند در دسترس نباشد ؛ RP می‌تواند با بررسی ویژگی isAutoSelected بررسی کند که آیا احراز هویت خودکار انجام می‌شود یا خیر.

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

احراز هویت مجدد خودکار کاربر از طریق FedCM.

اجرای میانجیگری با preventSilentAccess()

احراز هویت مجدد خودکار کاربران بلافاصله پس از خروج از سیستم، تجربه کاربری خیلی خوبی ایجاد نمی‌کند. به همین دلیل است که FedCM یک دوره سکوت 10 دقیقه‌ای پس از احراز هویت خودکار برای جلوگیری از این رفتار در نظر گرفته است. این بدان معناست که احراز هویت مجدد خودکار حداکثر هر 10 دقیقه یک بار اتفاق می‌افتد، مگر اینکه کاربر ظرف 10 دقیقه دوباره وارد سیستم شود. RP باید تابع navigator.credentials.preventSilentAccess() را فراخوانی کند تا صریحاً از مرورگر درخواست کند که احراز هویت خودکار را غیرفعال کند، زمانی که کاربر صریحاً از RP خارج می‌شود، به عنوان مثال، با کلیک بر روی دکمه خروج.

  function signout() {
    navigator.credentials.preventSilentAccess();
    location.href = '/signout';
  }

کاربران می‌توانند در تنظیمات، احراز هویت خودکار را غیرفعال کنند

کاربران می‌توانند از منوی تنظیمات، احراز هویت خودکار را غیرفعال کنند:

  • در کروم دسکتاپ، به chrome://password-manager/settings > Sign in automatically بروید.
  • در کروم اندروید، تنظیمات > مدیریت رمز عبور > روی چرخ‌دنده در گوشه بالا سمت راست ضربه بزنید > ورود خودکار.

با غیرفعال کردن این گزینه، کاربر می‌تواند از رفتار احراز هویت خودکار به‌طور کلی انصراف دهد. این تنظیم در صورتی که کاربر در نمونه کروم وارد حساب گوگل خود شده باشد و همگام‌سازی فعال باشد، در بین دستگاه‌ها ذخیره و همگام‌سازی می‌شود.

IdP را از RP جدا کنید

اگر کاربری قبلاً با استفاده از IdP از طریق FedCM وارد RP شده باشد، این رابطه توسط مرورگر به صورت محلی به عنوان لیست حساب‌های متصل به خاطر سپرده می‌شود. RP ممکن است با فراخوانی تابع IdentityCredential.disconnect() قطع ارتباط را آغاز کند. این تابع را می‌توان از یک فریم RP سطح بالا فراخوانی کرد. RP برای قطع ارتباط IdP باید یک configURL ، clientId مورد استفاده در IdP و یک accountHint ارسال کند. یک account hint می‌تواند یک رشته دلخواه باشد، مادامی که نقطه پایانی قطع ارتباط بتواند حساب را شناسایی کند، به عنوان مثال یک آدرس ایمیل یا شناسه کاربری که لزوماً با شناسه حسابی که نقطه پایانی لیست حساب ارائه کرده است، مطابقت ندارد:

  // Disconnect an IdP account 'account456' from the RP 'https://idp.com/'. This is invoked on the RP domain.
  IdentityCredential.disconnect({
    configURL: 'https://idp.com/config.json',
    clientId: 'rp123',
    accountHint: 'account456'
  });

IdentityCredential.disconnect() یک Promise برمی‌گرداند. این Promise ممکن است به دلایل زیر یک استثنا ایجاد کند:

  • کاربر با استفاده از IdP از طریق FedCM وارد RP نشده است.
  • این API از درون یک iframe و بدون سیاست مجوزهای FedCM فراخوانی می‌شود.
  • configURL نامعتبر است یا نقطه پایانی قطع ارتباط را ندارد.
  • بررسی سیاست امنیتی محتوا (CSP) ناموفق بود.
  • یک درخواست قطع ارتباط در حال بررسی است.
  • کاربر FedCM را در تنظیمات مرورگر غیرفعال کرده است.

وقتی نقطه پایانی قطع اتصال IdP پاسخی را برمی‌گرداند ، RP و IdP در مرورگر قطع می‌شوند و promise حل می‌شود. شناسه حساب‌های قطع شده در پاسخ از نقطه پایانی قطع اتصال مشخص می‌شود.