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

ตรวจสอบสิทธิ์โดยใช้ OpenID Connect บน Android

หากคุณได้อัปเกรดเป็นการตรวจสอบสิทธิ์ Firebase ด้วย Identity Platform คุณจะตรวจสอบสิทธิ์ผู้ใช้ด้วย Firebase ได้โดยใช้ผู้ให้บริการที่สอดคล้องกับ OpenID Connect (OIDC) ตามที่คุณต้องการ ซึ่งทำให้สามารถใช้ผู้ให้บริการข้อมูลประจำตัวที่ Firebase ไม่รองรับโดยกำเนิด

ก่อนจะเริ่ม

ในการลงชื่อเข้าใช้ผู้ใช้โดยใช้ผู้ให้บริการ OIDC คุณต้องรวบรวมข้อมูลบางอย่างจากผู้ให้บริการก่อน:

  • รหัสลูกค้า : สตริงเฉพาะสำหรับผู้ให้บริการที่ระบุแอปของคุณ ผู้ให้บริการของคุณอาจกำหนดรหัสลูกค้าที่แตกต่างกันให้กับแต่ละแพลตฟอร์มที่คุณสนับสนุน นี่เป็นหนึ่งในค่าของการเรียกร้อง aud ในโทเค็น ID ที่ออกโดยผู้ให้บริการของคุณ

  • ความลับไคลเอ็นต์ : สตริงลับที่ผู้ให้บริการใช้เพื่อยืนยันความเป็นเจ้าของ ID ไคลเอ็นต์ สำหรับรหัสลูกค้าทุกรหัส คุณจะต้องมีรหัสลับไคลเอ็นต์ที่ตรงกัน (ค่านี้จำเป็นเฉพาะเมื่อคุณใช้ auth code flow ซึ่งแนะนำเป็นอย่างยิ่ง)

  • ผู้ออก : สตริงที่ระบุผู้ให้บริการของคุณ ค่านี้ต้องเป็น URL ที่เมื่อต่อท้ายด้วย /.well-known/openid-configuration เป็นตำแหน่งของเอกสารการค้นพบ OIDC ของผู้ให้บริการ ตัวอย่างเช่น หากผู้ออกคือ https://auth.example.com เอกสารการค้นพบจะต้องอยู่ที่ https://auth.example.com/.well-known/openid-configuration

หลังจากที่คุณมีข้อมูลข้างต้นแล้ว ให้เปิดใช้งาน OpenID Connect เป็นผู้ให้บริการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase ของคุณ:

  1. เพิ่ม Firebase ในโครงการ Android ของคุณ

  2. หากคุณยังไม่ได้อัปเกรดเป็น Firebase Authentication ด้วย Identity Platform ให้ดำเนินการดังกล่าว การตรวจสอบสิทธิ์ OpenID Connect ใช้ได้เฉพาะในโปรเจ็กต์ที่อัปเกรดแล้ว

  3. ในหน้า ผู้ให้บริการการลงชื่อเข้าใช้ ของคอนโซล Firebase ให้คลิก เพิ่มผู้ให้บริการใหม่ จากนั้นคลิก OpenID Connect

  4. เลือกว่าคุณจะใช้โฟล ว์รหัสการ ให้สิทธิ์หรือโฟลว์การให้สิทธิ์โดยนัย

    คุณควรใช้โฟลว์โค้ดเสมอหากผู้ให้บริการของคุณรองรับ การไหลโดยปริยายมีความปลอดภัยน้อยกว่าและไม่แนะนำให้ใช้

  5. ตั้งชื่อให้กับผู้ให้บริการรายนี้ หมายเหตุ ID ผู้ให้บริการที่สร้างขึ้น: บางอย่างเช่น oidc.example-provider คุณจะต้องใช้รหัสนี้เมื่อเพิ่มรหัสลงชื่อเข้าใช้ในแอป

  6. ระบุรหัสลูกค้าและข้อมูลลับของลูกค้า และสตริงผู้ออกของผู้ให้บริการของคุณ ค่าเหล่านี้ต้องตรงกับค่าที่ผู้ให้บริการของคุณกำหนดให้คุณทุกประการ

  7. บันทึกการเปลี่ยนแปลงของคุณ

จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK

หากคุณกำลังสร้างแอป Android วิธีที่ง่ายที่สุดในการตรวจสอบสิทธิ์ผู้ใช้ของคุณด้วย Firebase โดยใช้ผู้ให้บริการ OIDC คือการจัดการขั้นตอนการลงชื่อเข้าใช้ทั้งหมดด้วย Firebase Android SDK

ในการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase Android SDK ให้ทำตามขั้นตอนเหล่านี้:

  1. สร้างอินสแตนซ์ของ OAuthProvider โดยใช้ตัว สร้าง ด้วย ID ของผู้ให้บริการ

    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 ของคุณสำหรับพารามิเตอร์ที่รองรับ โปรดทราบว่าคุณไม่สามารถส่งผ่านพารามิเตอร์ที่ต้องใช้ Firebase ด้วย setCustomParameters() พารามิเตอร์เหล่านี้ ได้แก่ 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);
    

    ตรวจสอบกับผู้ให้บริการ OIDC ของคุณสำหรับขอบเขตที่พวกเขาใช้

  4. ตรวจสอบสิทธิ์กับ Firebase โดยใช้วัตถุผู้ให้บริการ OAuth โปรดทราบว่าการดำเนินการนี้จะควบคุม UI ของคุณโดยเปิด แท็บ Chrome ที่กำหนดเอง ซึ่งไม่เหมือนกับการดำเนินการ FirebaseAuth อื่นๆ ดังนั้น อย่าอ้างอิงกิจกรรมของคุณใน 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 ในแอปแล้ว คุณสามารถใช้โทเค็น ID เพื่อตรวจสอบสิทธิ์กับ Firebase ได้โดยตรง:

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

ขั้นตอนถัดไป

หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก บัญชีผู้ใช้ใหม่จะถูกสร้างขึ้นและเชื่อมโยงกับข้อมูลประจำตัว กล่าวคือ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งผู้ใช้ลงชื่อเข้าใช้ บัญชีใหม่นี้จัดเก็บเป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ของคุณ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม

  • ในแอปของคุณ คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้จากอ็อบเจ็กต์ FirebaseUser ดู จัดการผู้ใช้

  • ในฐานข้อมูล Firebase Realtime Database และ Cloud Storage Security Rules คุณสามารถรับ ID ผู้ใช้เฉพาะของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้

คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูลรับรองของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่

หากต้องการออกจากระบบผู้ใช้ โทร signOut :

Java

FirebaseAuth.getInstance().signOut();

Kotlin+KTX

Firebase.auth.signOut()