अपने उपयोगकर्ताओं को Firebase की मदद से पुष्टि करने की अनुमति दी जा सकती है. इसके लिए, Microsoft Azure Active Directory जैसे OAuth प्रोवाइडर का इस्तेमाल करें. इसके लिए, Firebase SDK टूल का इस्तेमाल करके, अपने ऐप्लिकेशन में सामान्य OAuth लॉगिन को इंटिग्रेट करें. इससे, साइन-इन करने का पूरा फ़्लो पूरा किया जा सकता है.
शुरू करने से पहले
Microsoft खातों (Azure Active Directory और निजी Microsoft खातों) का इस्तेमाल करके उपयोगकर्ताओं को साइन इन कराने के लिए, आपको सबसे पहले अपने Firebase प्रोजेक्ट के लिए, साइन इन करने की सुविधा देने वाली कंपनी के तौर पर Microsoft को चालू करना होगा:
- अपने JavaScript प्रोजेक्ट में Firebase जोड़ें.
- Firebase कंसोल में, Auth सेक्शन खोलें.
- साइन इन करने का तरीका टैब पर, Microsoft की सेवा देने वाली कंपनी को चालू करें.
- सेवा देने वाली कंपनी के डेवलपर कंसोल से, क्लाइंट आईडी और क्लाइंट सीक्रेट को सेवा देने वाली कंपनी के कॉन्फ़िगरेशन में जोड़ें:
- Microsoft OAuth क्लाइंट को रजिस्टर करने के लिए, तुरंत शुरू करना: Azure Active Directory v2.0 एंडपॉइंट के साथ ऐप्लिकेशन रजिस्टर करना में दिए गए निर्देशों का पालन करें. ध्यान दें कि इस एंडपॉइंट से, Microsoft के निजी खातों के साथ-साथ Azure Active Directory खातों का इस्तेमाल करके साइन इन किया जा सकता है. Azure Active Directory v2.0 के बारे में ज़्यादा जानें.
- इन सेवा देने वाली कंपनियों के साथ ऐप्लिकेशन रजिस्टर करते समय, अपने प्रोजेक्ट के लिए
*.firebaseapp.com
डोमेन को अपने ऐप्लिकेशन के लिए रीडायरेक्ट डोमेन के तौर पर रजिस्टर करना न भूलें.
- सेव करें पर क्लिक करें.
Firebase SDK टूल की मदद से, साइन इन फ़्लो को मैनेज करना
अगर कोई वेब ऐप्लिकेशन बनाया जा रहा है, तो अपने उपयोगकर्ताओं के Microsoft खातों का इस्तेमाल करके, Firebase के साथ उनकी पुष्टि करने का सबसे आसान तरीका यह है कि Firebase JavaScript SDK टूल की मदद से, पूरे साइन-इन फ़्लो को मैनेज किया जाए.
Firebase JavaScript SDK की मदद से साइन-इन फ़्लो को मैनेज करने के लिए, यह तरीका अपनाएं:
प्रोवाइडर आईडी microsoft.com का इस्तेमाल करके, OAuthProvider का एक इंस्टेंस बनाएं.
import { OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com');
var provider = new firebase.auth.OAuthProvider('microsoft.com');
ज़रूरी नहीं: ऐसे अन्य कस्टम OAuth पैरामीटर बताएं जिन्हें आपको OAuth अनुरोध के साथ भेजना है.
provider.setCustomParameters({ // Force re-consent. prompt: 'consent', // Target specific email with login hint. login_hint: 'user@firstadd.onmicrosoft.com' });
provider.setCustomParameters({ // Force re-consent. prompt: 'consent', // Target specific email with login hint. login_hint: 'user@firstadd.onmicrosoft.com' });
Microsoft के साथ काम करने वाले पैरामीटर के बारे में जानने के लिए, Microsoft OAuth दस्तावेज़ देखें. ध्यान दें कि
setCustomParameters()
के साथ, Firebase के लिए ज़रूरी पैरामीटर पास नहीं किए जा सकते. ये पैरामीटर client_id, response_type, redirect_uri, state, scope, और response_mode हैं.सिर्फ़ किसी Azure AD टेनेंट के उपयोगकर्ताओं को ऐप्लिकेशन में साइन इन करने की अनुमति देने के लिए, Azure AD टेनेंट के फ़्रेंडली डोमेन नेम या टेनेंट के GUID आइडेंटिफ़ायर का इस्तेमाल किया जा सकता है. ऐसा करने के लिए, कस्टम पैरामीटर ऑब्जेक्ट में "किरायेदार" फ़ील्ड की जानकारी दें.
provider.setCustomParameters({ // Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". tenant: 'TENANT_ID' });
provider.setCustomParameters({ // Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". tenant: 'TENANT_ID' });
ज़रूरी नहीं: बुनियादी प्रोफ़ाइल के अलावा, OAuth 2.0 के अन्य स्कोप की जानकारी दें. इन स्कोप के लिए, आपको पुष्टि करने वाली सेवा देने वाली कंपनी से अनुरोध करना है.
provider.addScope('mail.read'); provider.addScope('calendars.read');
ज़्यादा जानने के लिए, Microsoft की अनुमतियां और सहमति से जुड़ा दस्तावेज़ पढ़ें.
OAuth प्रोवाइडर ऑब्जेक्ट का इस्तेमाल करके, Firebase से पुष्टि करना. आपके पास अपने उपयोगकर्ताओं को, पॉप-अप विंडो खोलकर या साइन-इन पेज पर रीडायरेक्ट करके, अपने Microsoft खातों से साइन इन करने के लिए कहने का विकल्प होता है. मोबाइल डिवाइसों पर, रीडायरेक्ट करने का तरीका इस्तेमाल करना बेहतर होता है.
- पॉप-अप विंडो से साइन इन करने के लिए,
signInWithPopup
को कॉल करें:
import { getAuth, signInWithPopup, OAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // User is signed in. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
firebase.auth().signInWithPopup(provider) .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });
- साइन इन पेज पर रीडायरेक्ट करके साइन इन करने के लिए,
signInWithRedirect
को कॉल करें:
signInWithRedirect
,linkWithRedirect
याreauthenticateWithRedirect
का इस्तेमाल करते समय, सबसे सही तरीके अपनाएं.import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
firebase.auth().signInWithRedirect(provider);
जब उपयोगकर्ता साइन इन कर लेता है और पेज पर वापस आ जाता है, तो
getRedirectResult
को कॉल करके, साइन इन का नतीजा पाया जा सकता है.import { getAuth, getRedirectResult, OAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // User is signed in. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
firebase.auth().getRedirectResult() .then((result) => { // IdP data available in result.additionalUserInfo.profile. // ... /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // OAuth access and id tokens can also be retrieved: var accessToken = credential.accessToken; var idToken = credential.idToken; }) .catch((error) => { // Handle error. });
पुष्टि हो जाने के बाद, सेवा देने वाली कंपनी से जुड़ा OAuth ऐक्सेस टोकन, दिखाए गए
firebase.auth.UserCredential
ऑब्जेक्ट से वापस पाया जा सकता है.OAuth ऐक्सेस टोकन का इस्तेमाल करके, Microsoft Graph API को कॉल किया जा सकता है.
उदाहरण के लिए, प्रोफ़ाइल की बुनियादी जानकारी पाने के लिए, इस REST API को कॉल किया जा सकता है:
curl -i -H "Authorization: Bearer ACCESS_TOKEN" https://graph.microsoft.com/v1.0/me
Firebase Auth के साथ काम करने वाली अन्य कंपनियों के उलट, Microsoft, फ़ोटो का यूआरएल नहीं देता. इसके बजाय, प्रोफ़ाइल फ़ोटो के बाइनरी डेटा का अनुरोध, Microsoft Graph API के ज़रिए करना पड़ता है.
OAuth ऐक्सेस टोकन के अलावा,
firebase.auth.UserCredential
ऑब्जेक्ट से उपयोगकर्ता का OAuth आईडी टोकन भी वापस पाया जा सकता है. आईडी टोकन में मौजूदsub
दावा, ऐप्लिकेशन के हिसाब से होता है. यह Firebase Auth के इस्तेमाल किए गए फ़ेडरेटेड उपयोगकर्ता आइडेंटिफ़ायर से मेल नहीं खाएगा. साथ ही, इसेuser.providerData[0].uid
के ज़रिए ऐक्सेस नहीं किया जा सकता. इसके बजाय,oid
दावा फ़ील्ड का इस्तेमाल किया जाना चाहिए. साइन-इन करने के लिए Azure AD टेंंट का इस्तेमाल करने पर,oid
दावा पूरी तरह से मैच करेगा. हालांकि, नॉन-टेंंट केस के लिए,oid
फ़ील्ड को पैड किया जाता है. फ़ेडरेटेड आईडी4b2eabcdefghijkl
के लिए,oid
का फ़ॉर्म00000000-0000-0000-4b2e-abcdefghijkl
होगा.- पॉप-अप विंडो से साइन इन करने के लिए,
ऊपर दिए गए उदाहरण, साइन इन फ़्लो पर फ़ोकस करते हैं. हालांकि, आपके पास
linkWithPopup
/linkWithRedirect
का इस्तेमाल करके, Microsoft के किसी सेवा देने वाली कंपनी को किसी मौजूदा उपयोगकर्ता से लिंक करने का विकल्प भी होता है. उदाहरण के लिए, एक ही उपयोगकर्ता से कई सेवा देने वाली कंपनियों को लिंक किया जा सकता है, ताकि वह किसी भी कंपनी से साइन इन कर सके.import { getAuth, linkWithPopup, OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com'); const auth = getAuth(); linkWithPopup(auth.currentUser, provider) .then((result) => { // Microsoft credential is linked to the current user. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
var provider = new firebase.auth.OAuthProvider('microsoft.com'); firebase.auth().currentUser.linkWithPopup(provider) .then((result) => { // Microsoft credential is linked to the current user. // IdP data available in result.additionalUserInfo.profile. // OAuth access token can also be retrieved: // result.credential.accessToken // OAuth ID token can also be retrieved: // result.credential.idToken }) .catch((error) => { // Handle error. });
इसी पैटर्न का इस्तेमाल
reauthenticateWithPopup
/reauthenticateWithRedirect
के साथ किया जा सकता है. इसका इस्तेमाल, संवेदनशील कार्रवाइयों के लिए नए क्रेडेंशियल पाने के लिए किया जा सकता है. इन कार्रवाइयों के लिए, हाल ही में लॉगिन करना ज़रूरी होता है.import { getAuth, reauthenticateWithPopup, OAuthProvider } from "firebase/auth"; const provider = new OAuthProvider('microsoft.com'); const auth = getAuth(); reauthenticateWithPopup(auth.currentUser, provider) .then((result) => { // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // Get the OAuth access token and ID Token const credential = OAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; const idToken = credential.idToken; }) .catch((error) => { // Handle error. });
var provider = new firebase.auth.OAuthProvider('microsoft.com'); firebase.auth().currentUser.reauthenticateWithPopup(provider) .then((result) => { // User is re-authenticated with fresh tokens minted and // should be able to perform sensitive operations like account // deletion and email or password update. // IdP data available in result.additionalUserInfo.profile. // OAuth access token can also be retrieved: // result.credential.accessToken // OAuth ID token can also be retrieved: // result.credential.idToken }) .catch((error) => { // Handle error. });
'खाता पहले से मौजूद है और उसके लिए अलग क्रेडेंशियल इस्तेमाल किए गए हैं' वाली गड़बड़ियों को मैनेज करना
अगर आपने Firebase कंसोल में हर ईमेल पते के लिए एक खाता सेटिंग चालू की है, तो जब कोई उपयोगकर्ता किसी ऐसे ईमेल पते से किसी सेवा देने वाली कंपनी (जैसे, Microsoft) में साइन इन करने की कोशिश करता है जो पहले से ही Firebase के किसी अन्य उपयोगकर्ता की सेवा देने वाली कंपनी (जैसे, Google) के लिए मौजूद है, तो उसे गड़बड़ी का मैसेज auth/account-exists-with-different-credential
दिखता है. साथ ही, AuthCredential
ऑब्जेक्ट (Microsoft क्रेडेंशियल) भी दिखता है. अपने चुने गए सेवा देने वालेAuthCredential
पॉप-अप मोड
signInWithPopup
का इस्तेमाल करने पर, auth/account-exists-with-different-credential
गड़बड़ियों को इस तरह के कोड की मदद से मैनेज किया जा सकता है:
import { getAuth, linkWithCredential, signInWithPopup, OAuthProvider, } from "firebase/auth"; try { // Step 1: User tries to sign in using Microsoft. let result = await signInWithPopup(getAuth(), new OAuthProvider()); } catch (error) { // Step 2: User's email already exists. if (error.code === "auth/account-exists-with-different-credential") { // The pending Microsoft credential. let pendingCred = error.credential; // Step 3: Save the pending credential in temporary storage, // Step 4: Let the user know that they already have an account // but with a different provider, and let them choose another // sign-in method. } } // ... try { // Step 5: Sign the user in using their chosen method. let result = await signInWithPopup(getAuth(), userSelectedProvider); // Step 6: Link to the Microsoft credential. // TODO: implement `retrievePendingCred` for your app. let pendingCred = retrievePendingCred(); if (pendingCred !== null) { // As you have access to the pending credential, you can directly call the // link method. let user = await linkWithCredential(result.user, pendingCred); } // Step 7: Continue to app. } catch (error) { // ... }
रीडायरेक्ट मोड
रीडायरेक्ट मोड में भी इस गड़बड़ी को इसी तरह मैनेज किया जाता है. हालांकि, इस मोड में पेज रीडायरेक्ट के बीच, पुष्टि बाकी होने वाले क्रेडेंशियल को कैश मेमोरी में सेव करना पड़ता है. उदाहरण के लिए, सेशन स्टोरेज का इस्तेमाल करके.
बेहतर सुविधा: साइन इन फ़्लो को मैन्युअल तरीके से मैनेज करना
Firebase के साथ काम करने वाली OAuth सेवा देने वाली अन्य कंपनियों, जैसे कि Google, Facebook, और Twitter के मुकाबले, Firebase Auth में सीधे OAuth ऐक्सेस टोकन के आधार पर क्रेडेंशियल की मदद से साइन इन नहीं किया जा सकता. Firebase Auth, Microsoft जैसी सेवा देने वाली कंपनियों के लिए यह सुविधा उपलब्ध नहीं कराता. इसकी वजह यह है कि Firebase Auth सर्वर, Microsoft OAuth ऐक्सेस टोकन की ऑडियंस की पुष्टि नहीं कर सकता. यह सुरक्षा से जुड़ी एक ज़रूरी शर्त है. इससे ऐप्लिकेशन और वेबसाइटों को फिर से होने वाले हमलों का शिकार बनाया जा सकता है. इन हमलों में, एक प्रोजेक्ट (हमलावर) के लिए मिले Microsoft OAuth ऐक्सेस टोकन का इस्तेमाल, किसी दूसरे प्रोजेक्ट (पीड़ित) में साइन इन करने के लिए किया जा सकता है. इसके बजाय, Firebase Auth पूरे OAuth फ़्लो और ऑथराइज़ेशन कोड एक्सचेंज को मैनेज करने की सुविधा देता है. इसके लिए, Firebase कंसोल में कॉन्फ़िगर किए गए OAuth क्लाइंट आईडी और सीक्रेट का इस्तेमाल किया जाता है. अनुमति कोड का इस्तेमाल सिर्फ़ किसी खास क्लाइंट आईडी/सीक्रेट के साथ किया जा सकता है. इसलिए, किसी एक प्रोजेक्ट के लिए मिले अनुमति कोड का इस्तेमाल किसी दूसरे प्रोजेक्ट के लिए नहीं किया जा सकता.
अगर इन सेवाओं का इस्तेमाल ऐसे एनवायरमेंट में करना है जहां ये काम नहीं करतीं, तो तीसरे पक्ष की OAuth लाइब्रेरी और Firebase के कस्टम ऑथेंटिकेशन का इस्तेमाल करना होगा. पहले को सेवा देने वाली कंपनी की पुष्टि करने के लिए ज़रूरत होती है और दूसरे को सेवा देने वाली कंपनी के क्रेडेंशियल को कस्टम टोकन के लिए एक्सचेंज करने के लिए ज़रूरत होती है.
Chrome एक्सटेंशन में Firebase की मदद से पुष्टि करना
अगर आपको Chrome एक्सटेंशन ऐप्लिकेशन बनाना है, तो ऑफ़स्क्रीन दस्तावेज़ों से जुड़ी गाइड देखें.
Microsoft साइन इन के लिए, रीडायरेक्ट डोमेन को पसंद के मुताबिक बनाना
प्रोजेक्ट बनाने पर, Firebase आपके प्रोजेक्ट के लिए एक यूनीक सबडोमेन उपलब्ध कराएगा:
https://my-app-12345.firebaseapp.com
.
इसका इस्तेमाल, OAuth साइन इन के लिए रीडायरेक्ट करने के तरीके के तौर पर भी किया जाएगा. उस डोमेन को, OAuth की सुविधा देने वाली सभी कंपनियों के लिए अनुमति दी जानी चाहिए. हालांकि, इसका मतलब है कि उपयोगकर्ताओं को ऐप्लिकेशन पर वापस रीडायरेक्ट करने से पहले, Microsoft में साइन इन करते समय वह डोमेन दिख सकता है: इस पर जाएं: https://my-app-12345.firebaseapp.com.
अपना सबडोमेन न दिखाने के लिए, Firebase Hosting की मदद से कस्टम डोमेन सेट अप किया जा सकता है:
- Hosting के लिए अपना डोमेन सेट अप करें में दिए गए पहले से तीसरे चरण को पूरा करें. डोमेन के मालिकाना हक की पुष्टि करने पर, Hosting आपके कस्टम डोमेन के लिए एसएसएल सर्टिफ़िकेट उपलब्ध कराता है.
- Firebase कंसोल में, अनुमति वाले डोमेन की सूची में अपना कस्टम डोमेन जोड़ें:
auth.custom.domain.com
. - Microsoft Developer Console या OAuth सेटअप पेज में, रीडायरेक्ट पेज के उस यूआरएल को व्हाइटलिस्ट करें जिसे आपके कस्टम डोमेन:
https://auth.custom.domain.com/__/auth/handler
पर ऐक्सेस किया जा सकेगा. - JavaScript लाइब्रेरी को शुरू करते समय,
authDomain
फ़ील्ड की मदद से अपना कस्टम डोमेन डालें:var config = { apiKey: '...', // Changed from '
PROJECT_ID .firebaseapp.com'. authDomain: 'auth.custom.domain.com', databaseURL: 'https://PROJECT_ID .firebaseio.com', projectId: 'PROJECT_ID ', storageBucket: ' ', messagingSenderId: 'PROJECT_ID .firebasestorage.appSENDER_ID ' }; firebase.initializeApp(config);
अगले चरण
जब कोई उपयोगकर्ता पहली बार साइन इन करता है, तो एक नया उपयोगकर्ता खाता बन जाता है. साथ ही, उसे उन क्रेडेंशियल से लिंक कर दिया जाता है जिनका इस्तेमाल करके उपयोगकर्ता ने साइन इन किया था. जैसे, उपयोगकर्ता का नाम और पासवर्ड, फ़ोन नंबर या पुष्टि करने वाली सेवा की जानकारी. इस नए खाते को आपके Firebase प्रोजेक्ट के हिस्से के तौर पर सेव किया जाता है. इसका इस्तेमाल, आपके प्रोजेक्ट के हर ऐप्लिकेशन में किसी उपयोगकर्ता की पहचान करने के लिए किया जा सकता है. भले ही, उपयोगकर्ता साइन इन करने का कोई भी तरीका अपनाए.
-
अपने ऐप्लिकेशन में, उपयोगकर्ता की पुष्टि की स्थिति जानने के लिए,
Auth
ऑब्जेक्ट पर ऑब्ज़र्वर सेट करने का सुझाव दिया जाता है. इसके बाद,User
ऑब्जेक्ट से उपयोगकर्ता की प्रोफ़ाइल की बुनियादी जानकारी पाई जा सकती है. उपयोगकर्ताओं को मैनेज करें देखें. अपने Firebase Realtime Database और Cloud Storage सुरक्षा नियमों में, आपके पास
auth
वैरिएबल से साइन इन किए गए उपयोगकर्ता का यूनीक उपयोगकर्ता आईडी पाने का विकल्प है. साथ ही, इसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.
पुष्टि करने वाली सेवा देने वाली कंपनी के क्रेडेंशियल को किसी मौजूदा उपयोगकर्ता खाते से लिंक करके, उपयोगकर्ताओं को पुष्टि करने वाली कई कंपनियों का इस्तेमाल करके, आपके ऐप्लिकेशन में साइन इन करने की अनुमति दी जा सकती है.
किसी उपयोगकर्ता को साइन आउट करने के लिए,
signOut
को कॉल करें:
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });