Google 致力于为黑人社区推动种族平等。查看具体举措

Android पर OpenID Connect का उपयोग करके प्रमाणित करें

यदि आपने पहचान प्लेटफ़ॉर्म के साथ Firebase प्रमाणीकरण में अपग्रेड किया है, तो आप अपनी पसंद के OpenID Connect (OIDC) अनुपालन प्रदाता का उपयोग करके अपने उपयोगकर्ताओं को Firebase से प्रमाणित कर सकते हैं। यह पहचान प्रदाताओं का उपयोग करना संभव बनाता है जो मूल रूप से फायरबेस द्वारा समर्थित नहीं हैं।

शुरू करने से पहले

OIDC प्रदाता का उपयोग करने वाले उपयोगकर्ताओं में साइन इन करने के लिए, आपको पहले प्रदाता से कुछ जानकारी एकत्र करनी होगी:

  • क्लाइंट आईडी : प्रदाता के लिए अद्वितीय स्ट्रिंग जो आपके ऐप की पहचान करती है। आपका प्रदाता आपके द्वारा समर्थित प्रत्येक प्लेटफ़ॉर्म के लिए आपको एक अलग क्लाइंट आईडी निर्दिष्ट कर सकता है। यह आपके प्रदाता द्वारा जारी किए गए आईडी टोकन में aud दावे के मूल्यों में से एक है।

  • क्लाइंट सीक्रेट : एक सीक्रेट स्ट्रिंग जिसका उपयोग प्रदाता क्लाइंट आईडी के स्वामित्व की पुष्टि करने के लिए करता है। प्रत्येक क्लाइंट आईडी के लिए, आपको मेल खाने वाले क्लाइंट सीक्रेट की आवश्यकता होगी। (यह मान केवल तभी आवश्यक है जब आप प्रमाणन कोड प्रवाह का उपयोग कर रहे हों, जिसकी पुरज़ोर अनुशंसा की जाती है।)

  • जारीकर्ता : एक स्ट्रिंग जो आपके प्रदाता की पहचान करती है। यह मान एक ऐसा URL होना चाहिए, जो /.well-known/openid-configuration के साथ जोड़े जाने पर, प्रदाता के OIDC खोज दस्तावेज़ का स्थान हो। उदाहरण के लिए, यदि जारीकर्ता https://auth.example.com है, तो खोज दस्तावेज़ https://auth.example.com/.well-known/openid-configuration पर उपलब्ध होना चाहिए।

आपके पास उपरोक्त जानकारी होने के बाद, अपने Firebase प्रोजेक्ट के लिए OpenID Connect को साइन-इन प्रदाता के रूप में सक्षम करें:

  1. अपने Android प्रोजेक्ट में Firebase जोड़ें

  2. अगर आपने आइडेंटिटी प्लेटफॉर्म के साथ फायरबेस ऑथेंटिकेशन में अपग्रेड नहीं किया है, तो ऐसा करें। OpenID Connect प्रमाणीकरण केवल अपग्रेड किए गए प्रोजेक्ट में उपलब्ध है।

  3. Firebase कंसोल के साइन-इन प्रदाता पृष्ठ पर, नया प्रदाता जोड़ें क्लिक करें और फिर OpenID Connect क्लिक करें।

  4. चुनें कि आप प्राधिकरण कोड प्रवाह या निहित अनुदान प्रवाह का उपयोग करेंगे या नहीं।

    यदि आपका प्रदाता इसका समर्थन करता है तो आपको हमेशा कोड प्रवाह का उपयोग करना चाहिए । निहित प्रवाह कम सुरक्षित है और इसका उपयोग करने से दृढ़ता से हतोत्साहित किया जाता है।

  5. इस प्रदाता को एक नाम दें। जेनरेट की गई प्रदाता आईडी पर ध्यान दें: oidc.example-provider जैसा कुछ। जब आप अपने ऐप में साइन-इन कोड जोड़ते हैं तो आपको इस आईडी की आवश्यकता होगी।

  6. अपनी क्लाइंट आईडी और क्लाइंट सीक्रेट और अपने प्रदाता की जारीकर्ता स्ट्रिंग निर्दिष्ट करें। ये मान आपके प्रदाता द्वारा आपको असाइन किए गए मानों से सटीक रूप से मेल खाना चाहिए।

  7. अपने परिवर्तन सहेजें।

Firebase SDK के साथ साइन-इन प्रवाह को प्रबंधित करें

यदि आप एक Android ऐप बना रहे हैं, तो अपने OIDC प्रदाता का उपयोग करके अपने उपयोगकर्ताओं को Firebase से प्रमाणित करने का सबसे आसान तरीका है, Firebase Android SDK के साथ संपूर्ण साइन-इन प्रवाह को संभालना।

Firebase Android SDK के साथ साइन-इन प्रवाह को संभालने के लिए, इन चरणों का पालन करें:

  1. प्रदाता की आईडी के साथ अपने निर्माता का उपयोग करके OAuthProvider का एक उदाहरण बनाएं

    Kotlin+KTX

    val providerBuilder = OAuthProvider.newBuilder("oidc.example-provider")
    

    Java

    OAuthProvider.Builder providerBuilder = OAuthProvider.newBuilder("oidc.example-provider");
    
  2. वैकल्पिक : अतिरिक्त कस्टम OAuth पैरामीटर निर्दिष्ट करें जिन्हें आप OAuth अनुरोध के साथ भेजना चाहते हैं।

    Kotlin+KTX

    // Target specific email with login hint.
    providerBuilder.addCustomParameter("login_hint", "user@example.com")
    

    Java

    // Target specific email with login hint.
    providerBuilder.addCustomParameter("login_hint", "user@example.com");
    

    अपने OIDC प्रदाता से उनके द्वारा समर्थित मापदंडों के लिए जाँच करें। ध्यान दें कि आप setCustomParameters() के साथ Firebase-आवश्यक पैरामीटर पास नहीं कर सकते। ये पैरामीटर हैं client_id , response_type , redirect_uri , State , scope और response_mode

  3. वैकल्पिक : मूल प्रोफ़ाइल से परे अतिरिक्त OAuth 2.0 स्कोप निर्दिष्ट करें जिसका आप प्रमाणीकरण प्रदाता से अनुरोध करना चाहते हैं।

    Kotlin+KTX

    val scopes = arrayListOf("mail.read", "calendars.read")
    providerBuilder.setScopes(scopes)
    

    Java

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("mail.read");
            add("calendars.read");
          }
        };
    providerBuilder.setScopes(scopes);
    

    अपने ओआईडीसी प्रदाता से उनके द्वारा उपयोग किए जाने वाले कार्यक्षेत्रों की जांच करें।

  4. OAuth प्रदाता ऑब्जेक्ट का उपयोग करके Firebase से प्रमाणित करें। ध्यान दें कि अन्य FirebaseAuth संचालनों के विपरीत, यह कस्टम Chrome टैब को पॉप अप करके आपके UI को नियंत्रित करेगा। परिणामस्वरूप, अपनी गतिविधि को OnSuccessListener और OnFailureListener में संदर्भित न करें जिसे आप संलग्न करते हैं क्योंकि जब ऑपरेशन UI शुरू करता है तो वे तुरंत अलग हो जाएंगे।

    आपको पहले जांच करनी चाहिए कि क्या आपको पहले ही कोई प्रतिक्रिया मिली है। इस पद्धति से साइन इन करने से आपकी गतिविधि पृष्ठभूमि में आ जाती है, जिसका अर्थ है कि साइन इन प्रवाह के दौरान सिस्टम द्वारा इसे पुनः प्राप्त किया जा सकता है। यह सुनिश्चित करने के लिए कि यदि ऐसा होता है तो आप उपयोगकर्ता को फिर से प्रयास करने के लिए नहीं कहते हैं, आपको यह जांचना चाहिए कि कोई परिणाम पहले से मौजूद है या नहीं।

    यह जांचने के लिए कि क्या कोई परिणाम लंबित है, getPendingAuthResult पर कॉल करें:

    Kotlin+KTX

    val pendingResultTask = FirebaseAuth.getInstance().pendingAuthResult
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
            .addOnSuccessListener { authResult ->
                // User is signed in.
    
                // IdP data available in
                //   authResult.additionalUserInfo.profile
    
                // The OAuth access token and ID token can also be retrieved:
                val credential = authResult.credential
                if (credential !is OAuthCredential)
                    return@addOnSuccessListener
                val accessToken = credential.accessToken
                val idToken = credential.idToken
            }
            .addOnFailureListener { e ->
                // Handle failure.
            }
    } else {
        // There's no pending result so you need to start the sign-in flow.
        // See below.
    }
    

    Java

    Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult();
    if (pendingResultTask != null) {
      // There's something already here! Finish the sign-in for your user.
      pendingResultTask
          .addOnSuccessListener(
              new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                  // User is signed in.
                  // IdP data available in
                  // authResult.getAdditionalUserInfo().getProfile().
                  // The OAuth access token can also be retrieved:
                  // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                  // The OAuth ID token can also be retrieved:
                  // ((OAuthCredential)authResult.getCredential()).getIdToken().
                }
              })
          .addOnFailureListener(
              new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                  // Handle failure.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

    साइन इन फ्लो शुरू करने के लिए startActivityForSignInWithProvider पर कॉल करें:

    Kotlin+KTX

    FirebaseAuth.getInstance()
        .startActivityForSignInWithProvider(/* activity= */ this, providerBuilder.build())
        .addOnSuccessListener { authResult ->
            // User is signed in.
    
            // IdP data available in:
            //    authResult.additionalUserInfo.profile
    
            // The OAuth access token and ID token can also be retrieved:
            val credential = authResult.credential
            if (credential !is OAuthCredential)
                return@addOnSuccessListener
            val accessToken = credential.accessToken
            val idToken = credential.idToken
        }
        .addOnFailureListener { e ->
            // Handle failure.
        }
    

    Java

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, providerBuilder.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is signed in.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
  5. जबकि उपरोक्त उदाहरण साइन-इन प्रवाह पर ध्यान केंद्रित करते हैं, आपके पास एक OIDC प्रदाता को किसी मौजूदा उपयोगकर्ता के साथ startActivityForLinkWithProvider का उपयोग करके लिंक करने की क्षमता भी है। उदाहरण के लिए, आप एक से अधिक प्रदाताओं को एक ही उपयोगकर्ता से लिंक कर सकते हैं जिससे वे दोनों में से किसी के साथ साइन इन कर सकें।

    Kotlin+KTX

    // The user is already signed-in.
    val firebaseUser = FirebaseAuth.getInstance().currentUser
    
    firebaseUser
        ?.startActivityForLinkWithProvider(/* activity= */ this, providerBuilder.build())
        ?.addOnSuccessListener { authResult ->
            // OIDC credential is linked to the current user.
    
            // IdP data available in:
            //   authResult.additionalUserInfo.profile
    
            // The OAuth access token and ID token can also be retrieved:
            val credential = authResult.credential
            if (credential !is OAuthCredential)
                return@addOnSuccessListener
            val accessToken = credential.accessToken
            val idToken = credential.idToken
        }
        ?.addOnFailureListener { e ->
            // Handle failure.
        }
    

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForLinkWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // Credential is linked to the current user.
                // IdP data available in
                // authResult.getAdditionalUserInfo().getProfile().
                // The OAuth access token can also be retrieved:
                // authResult.getCredential().getAccessToken().
                // The OAuth ID token can also be retrieved:
                // authResult.getCredential().getIdToken().
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    
  6. उसी पैटर्न का उपयोग startActivityForReauthenticateWithProvider के साथ किया जा सकता है जिसका उपयोग संवेदनशील संचालन के लिए नए क्रेडेंशियल्स को पुनः प्राप्त करने के लिए किया जा सकता है जिसके लिए हाल ही में लॉगिन की आवश्यकता होती है।

    Kotlin+KTX

    // The user is already signed-in.
    val firebaseUser = FirebaseAuth.getInstance().currentUser
    
    firebaseUser
        ?.startActivityForReauthenticateWithProvider(/* activity= */ this, providerBuilder.build())
        ?.addOnSuccessListener {
            // User is re-authenticated with fresh tokens and
            // should be able to perform sensitive operations
            // like account deletion and email or password
            // update.
        }
        ?.addOnFailureListener {
            // Handle failure.
        }
    

    Java

    // The user is already signed-in.
    FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
    
    firebaseUser
        .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
        .addOnSuccessListener(
            new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                // User is re-authenticated with fresh tokens and
                // should be able to perform sensitive operations
                // like account deletion and email or password
                // update.
              }
            })
        .addOnFailureListener(
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Handle failure.
              }
            });
    

साइन-इन प्रवाह को मैन्युअल रूप से प्रबंधित करें

यदि आपने अपने ऐप में OpenID Connect साइन-इन प्रवाह पहले ही लागू कर दिया है, तो आप Firebase से प्रमाणित करने के लिए सीधे ID टोकन का उपयोग कर सकते हैं:

Kotlin+KTX

      val credential = OAuthProvider
          .newCredentialBuilder("oidc.example-provider")  // As registered in Firebase console.
          .setIdToken(idToken)  // ID token from OpenID Connect flow.
          .build()
      FirebaseAuth.getInstance()
          .signInWithCredential(credential)
          .addOnSuccessListener { authResult ->
              // User is signed in.

              // IdP data available in:
              //    authResult.additionalUserInfo.profile
          }
          .addOnFailureListener { e ->
              // Handle failure.
          }

Java

AuthCredential credential = OAuthProvider
        .newCredentialBuilder("oidc.example-provider")  // As registered in Firebase console.
        .setIdToken(idToken)  // ID token from OpenID Connect flow.
        .build();
FirebaseAuth.getInstance()
        .signInWithCredential(credential)
        .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {
                // User is signed in.

                // IdP data available in:
                //    authResult.getAdditionalUserInfo().getProfile()
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // Handle failure.
            }
        });

अगले कदम

उपयोगकर्ता द्वारा पहली बार साइन इन करने के बाद, एक नया उपयोगकर्ता खाता बनाया जाता है और क्रेडेंशियल से लिंक किया जाता है—अर्थात, उपयोगकर्ता नाम और पासवर्ड, फ़ोन नंबर, या प्रमाणीकरण प्रदाता जानकारी—जिससे उपयोगकर्ता ने साइन इन किया है। यह नया खाता आपके फ़ायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत किया जाता है, और इसका उपयोग आपके प्रोजेक्ट में प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है, भले ही उपयोगकर्ता कैसे साइन इन करे।

  • अपने ऐप्स में, आप उपयोगकर्ता की मूलभूत प्रोफ़ाइल जानकारी FirebaseUser ऑब्जेक्ट से प्राप्त कर सकते हैं। उपयोगकर्ता प्रबंधित करें देखें।

  • अपने फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप auth चर से साइन-इन किए गए उपयोगकर्ता की अद्वितीय उपयोगकर्ता आईडी प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।

आप प्रमाणीकरण प्रदाता क्रेडेंशियल्स को मौजूदा उपयोगकर्ता खाते से लिंक करके एकाधिक प्रमाणीकरण प्रदाताओं का उपयोग करके उपयोगकर्ताओं को अपने ऐप में साइन इन करने की अनुमति दे सकते हैं।

किसी उपयोगकर्ता को साइन आउट करने के लिए, signOut पर कॉल करें:

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()