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

คุณอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ผู้ให้บริการ OAuth เช่น Microsoft Azure Active Directory โดยผสานการเข้าสู่ระบบ OAuth ทั่วไปบนเว็บในแอปของคุณโดยใช้ Firebase SDK เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ตั้งแต่ต้นจนจบ

ก่อนจะเริ่ม

ในการลงชื่อเข้าใช้ผู้ใช้โดยใช้บัญชี Microsoft (Azure Active Directory และบัญชี Microsoft ส่วนบุคคล) คุณต้องเปิดใช้งาน Microsoft เป็นผู้ให้บริการการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:

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

  2. ใน Firebase คอนโซล , เปิดส่วนการตรวจสอบสิทธิ์
  3. ที่ลงในแท็บวิธีการที่ช่วยให้ผู้ให้บริการไมโครซอฟท์
  4. เพิ่มรหัสลูกค้าและความลับของไคลเอ็นต์จากผู้ให้บริการที่นักพัฒนาคอนโซลการกำหนดค่าของผู้ให้บริการ:
    1. หากต้องการลงทะเบียนเป็นลูกค้าของ Microsoft OAuth ทำตามคำแนะนำใน Quickstart: สมัครสมาชิก app ที่มีสีฟ้าปลายทาง v2.0 Active Directory โปรดทราบว่าปลายทางนี้รองรับการลงชื่อเข้าใช้โดยใช้บัญชีส่วนตัวของ Microsoft เช่นเดียวกับบัญชี Azure Active Directory เรียนรู้เพิ่มเติม เกี่ยวกับ Azure Active Directory v2.0
    2. เมื่อลงทะเบียนกับผู้ให้บริการแอพพลิเคเหล่านี้ให้แน่ใจว่าได้ลงทะเบียน *.firebaseapp.com โดเมนสำหรับโครงการของคุณเป็นโดเมนเปลี่ยนเส้นทางแอปของคุณ
  5. คลิกบันทึก
  6. หากคุณยังไม่ได้ระบุของแอป SHA-1 ลายนิ้วมือทำจาก หน้าการตั้งค่า ของคอนโซล Firebase อ้างถึง การตรวจสอบสิทธิ์ลูกค้าของ สำหรับรายละเอียดเกี่ยวกับวิธีการที่จะได้รับของแอป SHA-1 ลายนิ้วมือ

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

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

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

  1. สร้างตัวอย่างของ OAuthProvider ใช้สร้างด้วยรหัสผู้ให้บริการ microsoft.com

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
    
  2. บังคับ: ระบุพารามิเตอร์ที่กำหนดเอง OAuth เพิ่มเติมที่คุณต้องการที่จะส่งคำขอของ OAuth

    // Force re-consent.
    provider.addCustomParameter("prompt", "consent");
    
    // Target specific email with login hint.
    provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
    

    สำหรับการสนับสนุนพารามิเตอร์ไมโครซอฟท์ให้ดู เอกสาร Microsoft OAuth โปรดทราบว่าคุณจะไม่สามารถส่งผ่านพารามิเตอร์ Firebase จำเป็นกับ setCustomParameters() พารามิเตอร์เหล่านี้เป็น client_id, response_type, redirect_uri รัฐขอบเขตและ response_mode

    เพื่อให้เฉพาะผู้ใช้จากผู้เช่า Azure AD รายใดรายหนึ่งเท่านั้นที่สามารถลงชื่อเข้าใช้แอปพลิเคชันได้ สามารถใช้ชื่อโดเมนที่เป็นมิตรของผู้เช่า Azure AD หรือตัวระบุ GUID ของผู้เช่าได้ ซึ่งสามารถทำได้โดยการระบุฟิลด์ "ผู้เช่า" ในออบเจ็กต์พารามิเตอร์ที่กำหนดเอง

    // 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".
    provider.addCustomParameter("tenant", "TENANT_ID");
    
  3. บังคับ: ระบุ OAuth เพิ่มเติม 2.0 ขอบเขตเกินรายละเอียดพื้นฐานที่คุณต้องการที่จะร้องขอจากผู้ให้บริการการตรวจสอบ

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

    ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ การอนุญาตและยินยอมเอกสารไมโครซอฟท์

  4. ตรวจสอบสิทธิ์กับ Firebase โดยใช้วัตถุผู้ให้บริการ OAuth หมายเหตุว่าแตกต่างจากการดำเนินงานอื่น ๆ FirebaseAuth นี้จะใช้การควบคุมของคุณ UI โดย popping ขึ้น แท็บ Chrome ที่กำหนดเอง เป็นผลให้ไม่อ้างอิงกิจกรรมใน OnSuccessListener และ OnFailureListener ที่คุณแนบที่พวกเขาทันทีจะถอดออกเมื่อการดำเนินการเริ่มต้นของ UI

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

    เพื่อตรวจสอบว่ามีผลอยู่ระหว่างดำเนินการเรียก getPendingAuthResult :

    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:
                  // 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.
                }
              });
    } else {
      // There's no pending result so you need to start the sign-in flow.
      // See below.
    }
    

    การเริ่มต้นการเข้าสู่ระบบการไหลโทร startActivityForSignInWithProvider :

    firebaseAuth
        .startActivityForSignInWithProvider(/* activity= */ this, provider.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.
              }
            });
    

    เกี่ยวกับความสำเร็จในการเข้าถึง OAuth โทเค็นที่เกี่ยวข้องกับผู้ให้บริการสามารถเรียกดูได้จาก OAuthCredential วัตถุกลับ

    ใช้โทเค็นการเข้าถึง OAuth คุณสามารถเรียกใช้ Microsoft Graph API

    ซึ่งแตกต่างจากผู้ให้บริการอื่น ๆ ที่ได้รับการสนับสนุนโดย Firebase Auth ไมโครซอฟท์ไม่ได้ให้ URL รูปภาพแทนข้อมูลไบนารีสำหรับภาพรายละเอียดจะต้องมีการร้องขอผ่านทาง Microsoft Graph API

    นอกเหนือไปจากโทเค็นการเข้าถึง OAuth ที่ OAuth ของผู้ใช้ โทเค็น ID ยังสามารถเรียกดูได้จาก OAuthCredential วัตถุ sub เรียกร้องในโทเค็นรหัสเป็น app ที่เฉพาะเจาะจงและจะไม่ตรงกับตัวระบุผู้ใช้ federated ใช้โดย Firebase รับรองความถูกต้องและเข้าถึงได้ผ่านทาง user.getProviderData().get(0).getUid() oid ฟิลด์เรียกร้องควรจะนำมาใช้แทน เมื่อใช้ผู้เช่า AD Azure ที่จะลงนามในการ oid เรียกร้องจะมีการแข่งขันที่แน่นอน อย่างไรก็ตามสำหรับกรณีที่ไม่ใช่ผู้เช่าที่ oid ฟิลด์เป็นเบาะ สำหรับรหัส federated 4b2eabcdefghijkl ที่ oid จะต้องมีรูปแบบที่ 00000000-0000-0000-4b2e-abcdefghijkl

  5. ในขณะที่ตัวอย่างข้างต้นมุ่งเน้นไปที่การลงชื่อเข้าใช้กระแสคุณยังมีความสามารถในการเชื่อมโยงผู้ให้บริการไมโครซอฟท์เป็นผู้ใช้ที่มีอยู่โดยใช้ startActivityForLinkWithProvider ตัวอย่างเช่น คุณสามารถเชื่อมโยงผู้ให้บริการหลายรายกับผู้ใช้รายเดียวกันเพื่อให้ลงชื่อเข้าใช้ได้

    // 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) {
                // Microsoft 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 ซึ่งสามารถใช้ในการดึงข้อมูลประจำตัวที่สดใหม่สำหรับการดำเนินงานที่สำคัญที่จำเป็นต้องเข้าสู่ระบบล่าสุด

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

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

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

  • ในปพลิเคชันของคุณคุณจะได้รับข้อมูลรายละเอียดของผู้ใช้พื้นฐานจาก FirebaseUser วัตถุ ดู การจัดการผู้ใช้

  • ในฐานข้อมูล Firebase เรียลไทม์และการจัดเก็บเมฆ กฎการรักษาความปลอดภัย , คุณจะได้รับการลงนามใน ID ผู้ใช้ของผู้ใช้ที่ไม่ซ้ำกันจาก auth ตัวแปรและใช้ในการควบคุมสิ่งที่ข้อมูลที่เข้าถึงผู้ใช้สามารถ

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

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

Java

FirebaseAuth.getInstance().signOut();

คอตลิน+KTX

Firebase.auth.signOut()