FedCM अपडेट: लॉगिन स्टेटस एपीआई, गड़बड़ी एपीआई, और अपने-आप चुने गए फ़्लैग एपीआई

Chrome 120 में, FedCM के लिए Login Status API उपलब्ध कराया जा रहा है. Login Status API (पहले इसे IdP Sign-in Status API के नाम से जाना जाता था) की मदद से, वेबसाइटें और खास तौर पर पहचान की पुष्टि करने वाली सेवा देने वाली कंपनियां, ब्राउज़र को यह सिग्नल दे सकती हैं कि उनके उपयोगकर्ता लॉग इन और लॉग आउट कर रहे हैं. FedCM इस सिग्नल का इस्तेमाल, साइलेंट टाइमिंग अटैक की समस्या को हल करने के लिए करता है. इससे FedCM को तीसरे पक्ष की कुकी के बिना काम करने की अनुमति मिलती है. इस अपडेट में, FedCM को शिप करने के मूल इंटेंट में किए गए उन बदलावों को ठीक किया गया है जो पुराने सिस्टम के साथ काम नहीं करते. हमने इन बदलावों की पहचान, काम के दायरे के तहत की थी.

Login Status API, निजता प्रॉपर्टी और इस्तेमाल करने के तरीके को बेहतर बनाता है. हालांकि, इसे लॉन्च करने के बाद, यह पुराने वर्शन के साथ काम नहीं करता. अगर आपने पहले से ही FedCM लागू किया हुआ है, तो यहां दिए गए निर्देशों का पालन करके इसे अपडेट करना न भूलें.

इसके अलावा, Chrome में फ़ेडरेटेड क्रेडेंशियल मैनेजमेंट (FedCM) की दो नई सुविधाएं भी जोड़ी जा रही हैं:

  • Error API: अगर आईडी एश्योरेंस एंडपॉइंट से सर्वर का कोई रिस्पॉन्स मिलता है, तो उपयोगकर्ताओं को नेटिव यूज़र इंटरफ़ेस (यूआई) के ज़रिए, साइन इन करने में हुई गड़बड़ी के बारे में सूचना दें.
  • अपने-आप चुने गए फ़्लैग एपीआई: अगर फ़्लो में क्रेडेंशियल अपने-आप चुने गए हैं, तो आइडेंटिटी प्रोवाइडर (IdP) और भरोसेमंद पार्टी (RP) को सूचना दें.

Login Status API

लॉगिन स्टेटस एपीआई एक ऐसा तरीका है जिससे कोई वेबसाइट, खास तौर पर आईडीपी, ब्राउज़र को आईडीपी पर उपयोगकर्ता के लॉगिन स्टेटस की जानकारी देता है. इस एपीआई की मदद से, ब्राउज़र, आईडीपी को किए जाने वाले ग़ैर-ज़रूरी अनुरोधों को कम कर सकता है. साथ ही, टाइमिंग से जुड़े संभावित हमलों को कम कर सकता है.

उपयोगकर्ता के लॉगिन स्टेटस के बारे में ब्राउज़र को बताना

आईडीपी, उपयोगकर्ता के लॉगिन स्टेटस की जानकारी ब्राउज़र को भेज सकते हैं. इसके लिए, वे एचटीटीपी हेडर भेजते हैं या JavaScript एपीआई को कॉल करते हैं. ऐसा तब होता है, जब उपयोगकर्ता आईडीपी पर साइन इन करता है या अपने सभी आईडीपी खातों से साइन आउट करता है. हर आईडीपी (जिसे उसके कॉन्फ़िगरेशन यूआरएल से पहचाना जाता है) के लिए, ब्राउज़र में तीन स्थितियों वाला एक वैरिएबल होता है. यह वैरिएबल, logged-in, logged-out, और unknown जैसी वैल्यू के साथ लॉगिन स्टेटस दिखाता है. डिफ़ॉल्ट स्थिति unknown है.

उपयोगकर्ता के साइन इन होने का सिग्नल देने के लिए, टॉप-लेवल नेविगेशन या एक ही ऑरिजिन के सब-रिसॉर्स के अनुरोध में Set-Login: logged-in एचटीटीपी हेडर भेजें:

Set-Login: logged-in

इसके अलावा, IdP ऑरिजिन से JavaScript API navigator.login.setStatus('logged-in') को कॉल करें:

navigator.login.setStatus('logged-in');

इन कॉल से, उपयोगकर्ता के लॉगिन स्टेटस को logged-in के तौर पर रिकॉर्ड किया जाता है. जब उपयोगकर्ता का लॉगिन स्टेटस logged-in पर सेट होता है, तो FedCM को कॉल करने वाला आरपी, आईडीपी के खातों की सूची वाले एंडपॉइंट से अनुरोध करता है. साथ ही, FedCM डायलॉग में उपयोगकर्ता को उपलब्ध खाते दिखाता है.

उपयोगकर्ता के सभी खातों से साइन आउट होने का सिग्नल देने के लिए, टॉप-लेवल नेविगेशन या एक ही ऑरिजिन के सब-रिसॉर्स के अनुरोध में Set-Login: logged-out एचटीटीपी हेडर भेजें:

Set-Login: logged-out

इसके अलावा, IdP ऑरिजिन से JavaScript API navigator.login.setStatus('logged-out') को कॉल करें:

navigator.login.setStatus('logged-out');

इन कॉल से, उपयोगकर्ता के लॉगिन स्टेटस को logged-out के तौर पर रिकॉर्ड किया जाता है. जब उपयोगकर्ता का लॉगिन स्टेटस logged-out होता है, तो IdP के खातों की सूची वाले एंडपॉइंट से अनुरोध किए बिना, FedCM को कॉल करने पर, वह चुपचाप बंद हो जाता है.

IdP, Login Status API का इस्तेमाल करके सिग्नल भेजने से पहले, unknown स्टेटस सेट हो जाता है. हमने बेहतर ट्रांज़िशन के लिए यह स्टेटस शुरू किया है. ऐसा इसलिए है, क्योंकि हो सकता है कि जब हम यह एपीआई शिप करें, तब उपयोगकर्ता ने पहले ही आईडीपी में साइन इन कर लिया हो. हो सकता है कि FedCM को पहली बार ट्रिगर करने तक, आईडीपी के पास ब्राउज़र को इसकी सूचना देने का मौका न हो. इस मामले में, हम आईडीपी के खातों की सूची वाले एंडपॉइंट से अनुरोध करते हैं. साथ ही, खातों की सूची वाले एंडपॉइंट से मिले जवाब के आधार पर स्थिति अपडेट करते हैं:

  • अगर एंडपॉइंट, चालू खातों की सूची दिखाता है, तो स्थिति को logged-in पर अपडेट करें. साथ ही, उन खातों को दिखाने के लिए FedCM डायलॉग खोलें.
  • अगर एंडपॉइंट कोई खाता नहीं दिखाता है, तो स्थिति को logged-out पर अपडेट करें और FedCM कॉल को फ़ेल करें.

अगर उपयोगकर्ता का सेशन खत्म हो जाता है, तो क्या होगा? उपयोगकर्ता को डाइनैमिक लॉगिन फ़्लो की मदद से साइन इन करने की सुविधा दें!

भले ही, आईडीपी ब्राउज़र को उपयोगकर्ता के लॉगिन स्टेटस की जानकारी देता रहता है, लेकिन स्टेटस सिंक न हो सकता है. जैसे, जब सेशन की समयसीमा खत्म हो जाती है. जब लॉगिन की स्थिति logged-in होती है, तो ब्राउज़र, खातों की सूची के एंडपॉइंट पर क्रेडेंशियल वाला अनुरोध भेजने की कोशिश करता है. हालांकि, सर्वर कोई खाता नहीं दिखाता, क्योंकि सेशन अब उपलब्ध नहीं है. ऐसे में, ब्राउज़र उपयोगकर्ता को डायलॉग विंडो के ज़रिए, आईडीपी में डाइनैमिक तौर पर साइन इन करने की अनुमति दे सकता है.

FedCM डायलॉग बॉक्स में, साइन इन करने का सुझाव देने वाला मैसेज दिखता है. इसकी इमेज यहां दी गई है.

FedCM डायलॉग, जिसमें आईडीपी में साइन इन करने का सुझाव दिया गया है.
FedCM का एक डायलॉग, जिसमें आईडीपी (IdP) में साइन इन करने का सुझाव दिया गया है.

जब उपयोगकर्ता जारी रखें बटन पर क्लिक करता है, तो ब्राउज़र, आईडीपी के लॉगिन पेज के लिए एक डायलॉग खोलता है.

डायलॉग का उदाहरण.
आईडीपी (IdP) में साइन इन करें बटन पर क्लिक करने के बाद दिखने वाले डायलॉग का उदाहरण.

लॉगिन पेज का यूआरएल, आईडीपी कॉन्फ़िगरेशन फ़ाइल के हिस्से के तौर पर login_url के साथ दिया गया है.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

डायलॉग एक सामान्य ब्राउज़र विंडो होती है, जिसमें पहले पक्ष की कुकी होती हैं. डायलॉग बॉक्स में जो भी होता है वह आईडीपी पर निर्भर करता है. साथ ही, आरपी पेज पर क्रॉस-ऑरिजिन कम्यूनिकेशन का अनुरोध करने के लिए, कोई विंडो हैंडल उपलब्ध नहीं होता. उपयोगकर्ता के साइन इन करने के बाद, आईडीपी को:

  • ब्राउज़र को यह बताने के लिए कि उपयोगकर्ता ने साइन इन कर लिया है, Set-Login: logged-in हेडर भेजें या navigator.login.setStatus("logged-in") एपीआई को कॉल करें.
  • डायलॉग बॉक्स बंद करने के लिए, IdentityProvider.close() को कॉल करें.
उपयोगकर्ता, FedCM का इस्तेमाल करके आईडीपी में साइन इन करने के बाद, आरपी में साइन इन करता है.
उपयोगकर्ता, FedCM का इस्तेमाल करके आईडीपी में साइन इन करने के बाद, आरपी में साइन इन करता है.

हमारे डिमो में, Login Status API के काम करने का तरीका आज़माया जा सकता है.

  1. आईडीपी पर जाएं और साइन इन करें बटन पर टैप करें.
  2. किसी भी खाते से साइन इन करें.
  3. खाते की स्थिति ड्रॉपडाउन से, सेशन की समयसीमा खत्म हो गई चुनें.
  4. निजी जानकारी अपडेट करें बटन दबाएं.
  5. FedCM को आज़माने के लिए आरपी पर जाएं बटन पर टैप करें.

आपको मॉड्यूल के व्यवहार से, आईडीपी में लॉगिन करने की जानकारी मिलनी चाहिए.

Error API

जब Chrome, आईडी एश्योरेशन एंडपॉइंट (उदाहरण के लिए, जब कोई उपयोगकर्ता FedCM यूज़र इंटरफ़ेस पर इसी तौर पर जारी रखें बटन पर क्लिक करता है या अपने-आप फिर से पुष्टि करने की सुविधा चालू होती है) को अनुरोध भेजता है, तो हो सकता है कि आईडीपी, मान्य वजहों से टोकन जारी न कर पाए. उदाहरण के लिए, अगर क्लाइंट के पास अनुमति नहीं है, सर्वर कुछ समय के लिए उपलब्ध नहीं है वगैरह. फ़िलहाल, ऐसी गड़बड़ियों की वजह से Chrome, अनुरोध को चुपचाप अस्वीकार कर देता है. साथ ही, सिर्फ़ वादा अस्वीकार करके आरपी को सूचना देता है.

Error API की मदद से, Chrome उपयोगकर्ता को सूचना देता है. इसके लिए, वह नेटिव यूज़र इंटरफ़ेस (यूआई) दिखाता है. इसमें, IdP की ओर से दी गई गड़बड़ी की जानकारी होती है.

उपयोगकर्ता के साइन इन करने की कोशिश के विफल होने के बाद, गड़बड़ी का मैसेज दिखाने वाला FedCM डायलॉग. यह स्ट्रिंग, गड़बड़ी के टाइप से जुड़ी होती है.
FedCM डायलॉग, जिसमें उपयोगकर्ता के साइन इन करने की कोशिश के विफल होने के बाद, गड़बड़ी का मैसेज दिख रहा है. यह स्ट्रिंग, गड़बड़ी के टाइप से जुड़ी होती है.

IdP HTTP API

id_assertion_endpoint रिस्पॉन्स में, आईडीपी ब्राउज़र को एक टोकन दिखा सकता है. हालांकि, ऐसा तब ही होगा, जब अनुरोध करने पर उसे जारी किया जा सकता हो. इस प्रस्ताव के मुताबिक, अगर टोकन जारी नहीं किया जा सकता, तो आईडीपी "गड़बड़ी" वाला जवाब दे सकता है. इसमें दो नए वैकल्पिक फ़ील्ड होते हैं:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

कोड के लिए, आईडीपी OAuth 2.0 के लिए तय की गई गड़बड़ी की सूची[invalid_request, unauthorized_client, access_denied, server_error, और temporarily_unavailable] में से कोई एक गड़बड़ी चुन सकता है या अपनी पसंद की कोई स्ट्रिंग इस्तेमाल कर सकता है. अगर ऐसा है, तो Chrome, गड़बड़ी के यूज़र इंटरफ़ेस (यूआई) को गड़बड़ी के सामान्य मैसेज के साथ रेंडर करता है और कोड को आरपी को पास करता है.

url के लिए, यह गड़बड़ी के बारे में जानकारी देने वाले ऐसे वेब पेज की पहचान करता है जिसे कोई भी व्यक्ति पढ़ सकता है. इससे, उपयोगकर्ताओं को गड़बड़ी के बारे में ज़्यादा जानकारी मिलती है. यह फ़ील्ड, उपयोगकर्ताओं के लिए मददगार होता है, क्योंकि ब्राउज़र, नेटिव यूज़र इंटरफ़ेस (यूआई) में गड़बड़ी के बारे में बेहतर मैसेज नहीं दे सकते. उदाहरण के लिए, अगले चरण के लिए लिंक, ग्राहक सेवा से संपर्क करने की जानकारी वगैरह. अगर किसी उपयोगकर्ता को गड़बड़ी की जानकारी और उसे ठीक करने के तरीके के बारे में ज़्यादा जानना है, तो वह ज़्यादा जानकारी के लिए ब्राउज़र यूज़र इंटरफ़ेस (यूआई) से दिए गए पेज पर जा सकता है. यूआरएल, आईडीपी configURL की साइट का ही होना चाहिए.

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

अपने-आप चुने गए फ़्लैग का एपीआई

mediation: optional, क्रेडेंशियल मैनेजमेंट एपीआई में उपयोगकर्ता के डिफ़ॉल्ट मीडिएशन व्यवहार है. यह मुमकिन होने पर, अपने-आप फिर से पुष्टि करने की सुविधा को ट्रिगर करता है. हालांकि, अपने-आप फिर से पुष्टि करने की सुविधा, उपलब्ध न हो. ऐसा उन वजहों से हो सकता है जिनके बारे में सिर्फ़ ब्राउज़र को पता होता है. अगर यह सुविधा उपलब्ध नहीं है, तो उपयोगकर्ता को साफ़ तौर पर उपयोगकर्ता मीडिएशन की मदद से साइन इन करने के लिए कहा जा सकता है. यह अलग-अलग प्रॉपर्टी वाला फ़्लो होता है.

  • एपीआई कॉलर के नज़रिए से, जब उन्हें आईडी टोकन मिलता है, तो उन्हें यह जानकारी नहीं मिलती कि यह अपने-आप फिर से पुष्टि करने की प्रोसेस का नतीजा है या नहीं. इससे, एपीआई की परफ़ॉर्मेंस का आकलन करना और यूज़र एक्सपीरियंस को बेहतर बनाना उनके लिए मुश्किल हो जाता है.
  • आईडीपी के नज़रिए से, यह पता लगाना भी मुश्किल है कि परफ़ॉर्मेंस का आकलन करने के लिए, अपने-आप फिर से पुष्टि हुई है या नहीं. इसके अलावा, अगर उपयोगकर्ता के साथ साफ़ तौर पर मध्यस्थता की गई थी, तो इससे उन्हें सुरक्षा से जुड़ी ज़्यादा सुविधाओं को उपलब्ध कराने में मदद मिल सकती है. उदाहरण के लिए, कुछ उपयोगकर्ता ज़्यादा सुरक्षा वाले टीयर को प्राथमिकता दे सकते हैं. इसके लिए, पुष्टि करने के दौरान उपयोगकर्ता को साफ़ तौर पर बताना होगा कि वह पुष्टि कर रहा है. अगर किसी आईडीपी को इस तरह के मीडिएशन के बिना टोकन का अनुरोध मिलता है, तो वह अनुरोध को अलग तरीके से मैनेज कर सकता है. उदाहरण के लिए, गड़बड़ी का ऐसा कोड दिखाएं जिससे आरपी, mediation: required के साथ फिर से FedCM API को कॉल कर सके.

इसलिए, अपने-आप फिर से पुष्टि करने वाले फ़्लो को दिखाने से डेवलपर को फ़ायदा होगा.

अपने-आप चुने गए फ़्लैग एपीआई की मदद से, Chrome यह जानकारी शेयर करता है कि उपयोगकर्ता ने इसी तौर पर जारी रखें बटन पर टैप करके, साफ़ तौर पर अनुमति दी है या नहीं. यह जानकारी, IdP और RP, दोनों के साथ शेयर की जाती है. ऐसा तब होता है, जब अपने-आप फिर से पुष्टि करने की सुविधा चालू हो या साफ़ तौर पर मीडिएशन हुआ हो. डेटा सिर्फ़ तब शेयर किया जाता है, जब उपयोगकर्ता ने IdP/RP के साथ डेटा शेयर करने की अनुमति दी हो.

आईडीपी शेयर करना

उपयोगकर्ता की अनुमति के बाद, आईडीपी के साथ जानकारी शेयर करने के लिए, Chrome id_assertion_endpoint को भेजे गए POST अनुरोध में is_auto_selected=true शामिल करता है:

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

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

आरपी शेयर करना

ब्राउज़र, isAutoSelected में IdentityCredential के ज़रिए आरपी के साथ जानकारी शेयर कर सकता है:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

दर्शकों से जुड़ना और सुझाव/राय देना या शिकायत करना

अगर आपके पास सुझाव, शिकायत या राय है या आपको जांच के दौरान कोई समस्या आती है, तो crbug.com पर जाएं और उन्हें शेयर करें.

Unsplash पर लाल टोपी वाली लड़की की फ़ोटो