احراز هویت با استفاده از مایکروسافت در اندروید

می‌توانید به کاربران خود اجازه دهید با Firebase با استفاده از ارائه‌دهندگان OAuth مانند Microsoft Azure Active Directory با یکپارچه‌سازی OAuth Login عمومی مبتنی بر وب در برنامه خود با استفاده از Firebase SDK برای انجام جریان ورود به سیستم از انتها به سیستم، احراز هویت کنند.

قبل از اینکه شروع کنی

برای ورود کاربران با استفاده از حساب‌های مایکروسافت (Azure Active Directory و حساب‌های شخصی مایکروسافت)، ابتدا باید Microsoft را به‌عنوان ارائه‌دهنده ورود برای پروژه Firebase خود فعال کنید:

  1. Firebase را به پروژه اندروید خود اضافه کنید .

  2. در کنسول Firebase ، بخش Auth را باز کنید.
  3. در زبانه روش ورود به سیستم ، ارائه دهنده مایکروسافت را فعال کنید.
  4. شناسه مشتری و Client Secret را از کنسول توسعه دهنده آن ارائه دهنده به پیکربندی ارائه دهنده اضافه کنید:
    1. برای ثبت یک سرویس گیرنده Microsoft OAuth، دستورالعمل‌های موجود در Quickstart را دنبال کنید: یک برنامه را با نقطه پایانی Azure Active Directory v2.0 ثبت کنید . توجه داشته باشید که این نقطه پایانی از ورود به سیستم با استفاده از حساب‌های شخصی مایکروسافت و همچنین حساب‌های Azure Active Directory پشتیبانی می‌کند. درباره Azure Active Directory نسخه 2.0 بیشتر بدانید .
    2. هنگام ثبت برنامه در این ارائه دهندگان، مطمئن شوید که دامنه *.firebaseapp.com را برای پروژه خود به عنوان دامنه تغییر مسیر برای برنامه خود ثبت کنید.
  5. روی ذخیره کلیک کنید.
  6. اگر هنوز اثر انگشت SHA-1 برنامه خود را مشخص نکرده‌اید، این کار را از صفحه تنظیمات کنسول Firebase انجام دهید. برای جزئیات در مورد نحوه دریافت اثر انگشت SHA-1 برنامه خود، به تأیید اعتبار مشتری خود مراجعه کنید.

جریان ورود به سیستم را با Firebase SDK مدیریت کنید

اگر در حال ساخت یک برنامه اندروید هستید، ساده ترین راه برای احراز هویت کاربران خود با Firebase با استفاده از حساب های مایکروسافت آن ها این است که کل جریان ورود به سیستم را با Firebase Android SDK مدیریت کنید.

برای مدیریت جریان ورود به سیستم با Firebase Android SDK، این مراحل را دنبال کنید:

  1. یک نمونه از یک OAuthProvider با استفاده از سازنده آن با شناسه ارائه دهنده microsoft.com بسازید.

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("microsoft.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");

  2. اختیاری : پارامترهای سفارشی OAuth اضافی را که می خواهید با درخواست OAuth ارسال کنید، مشخص کنید.

    Kotlin+KTX

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

    Java

    // Target specific email with login hint.
    // 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 , answer_type , redirect_uri , state , scope و answer_mode .

    برای اینکه فقط کاربران یک مستاجر Azure AD خاص بتوانند وارد برنامه شوند، می توان از نام دامنه دوستانه مستاجر Azure AD یا شناسه GUID مستاجر استفاده کرد. این را می توان با تعیین فیلد "مستاجر" در شیء پارامترهای سفارشی انجام داد.

    Kotlin+KTX

    // 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")

    Java

    // 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 اضافی را فراتر از نمایه اصلی که می خواهید از ارائه دهنده احراز هویت درخواست کنید، مشخص کنید.

    Kotlin+KTX

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    provider.scopes = listOf("mail.read", "calendars.read")

    Java

    // Request read access to a user's email addresses.
    // This must be preconfigured in the app's API permissions.
    List<String> scopes =
            new ArrayList<String>() {
                {
                    add("mail.read");
                    add("calendars.read");
                }
            };
    provider.setScopes(scopes);

    برای کسب اطلاعات بیشتر، به مجوزها و اسناد رضایت Microsoft مراجعه کنید.

  4. با استفاده از شی ارائه دهنده OAuth با Firebase احراز هویت کنید. توجه داشته باشید که برخلاف سایر عملیات FirebaseAuth، با باز کردن یک برگه سفارشی Chrome، رابط کاربری شما را کنترل می‌کند. در نتیجه، فعالیت خود را در OnSuccessListener و OnFailureListener که پیوست می‌کنید ارجاع ندهید، زیرا با شروع عملیات رابط کاربری، فوراً جدا می‌شوند.

    ابتدا باید بررسی کنید که آیا قبلاً پاسخی دریافت کرده اید یا خیر. ورود به سیستم از طریق این روش، Activity شما را در پس‌زمینه قرار می‌دهد، به این معنی که سیستم می‌تواند آن را در طول ورود به سیستم بازیابی کند. برای اینکه مطمئن شوید در صورت وقوع این اتفاق، کاربر را مجبور به امتحان مجدد نمی‌کنید، باید بررسی کنید که آیا نتیجه از قبل وجود دارد یا خیر.

    برای بررسی اینکه آیا نتیجه معلقی وجود دارد، با getPendingAuthResult تماس بگیرید:

    Kotlin+KTX

    val pendingResultTask = firebaseAuth.pendingAuthResult
    if (pendingResultTask != null) {
        // There's something already here! Finish the sign-in for your user.
        pendingResultTask
            .addOnSuccessListener {
                // 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 secret can be retrieved by calling:
                // ((OAuthCredential)authResult.getCredential()).getSecret().
            }
            .addOnFailureListener {
                // 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 secret can be retrieved by calling:
                                // ((OAuthCredential)authResult.getCredential()).getSecret().
                            }
                        })
                .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
        .startActivityForSignInWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // 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 secret can be retrieved by calling:
            // ((OAuthCredential)authResult.getCredential()).getSecret().
        }
        .addOnFailureListener {
            // Handle failure.
        }

    Java

    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:
                            // ((OAuthCredential)authResult.getCredential()).getAccessToken().
                            // The OAuth secret can be retrieved by calling:
                            // ((OAuthCredential)authResult.getCredential()).getSecret().
                        }
                    })
            .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 در کد ID مربوط به برنامه است و با شناسه کاربر فدرال استفاده شده توسط Firebase Auth و قابل دسترسی از طریق user.getProviderData().get(0).getUid() مطابقت ندارد. به جای آن باید از فیلد ادعای oid استفاده شود. هنگام استفاده از مستاجر Azure AD برای ورود به سیستم، ادعای oid کاملاً مطابقت دارد. با این حال، برای مورد غیر مستاجر، فیلد oid پر شده است. برای شناسه فدرال 4b2eabcdefghijkl ، oid دارای فرم 00000000-0000-0000-4b2e-abcdefghijkl خواهد بود.

  5. در حالی که مثال‌های بالا بر جریان‌های ورود تمرکز دارند، شما همچنین می‌توانید با استفاده از startActivityForLinkWithProvider یک ارائه‌دهنده مایکروسافت را به یک کاربر موجود پیوند دهید. برای مثال، می‌توانید چندین ارائه‌دهنده را به یک کاربر پیوند دهید و به آنها اجازه دهید با هر یک از آنها وارد سیستم شوند.

    Kotlin+KTX

    // The user is already signed-in.
    val firebaseUser = firebaseAuth.currentUser!!
    firebaseUser
        .startActivityForLinkWithProvider(activity, provider.build())
        .addOnSuccessListener {
            // Provider 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 secret can be retrieved by calling:
            // authResult.getCredential().getSecret().
        }
        .addOnFailureListener {
            // 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) {
                            // Provider 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 secret can be retrieved by calling:
                            // authResult.getCredential().getSecret().
                        }
                    })
            .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.currentUser!!
    firebaseUser
        .startActivityForReauthenticateWithProvider(activity, provider.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.
                        }
                    });

مراحل بعدی

پس از اینکه کاربر برای اولین بار وارد سیستم شد، یک حساب کاربری جدید ایجاد می‌شود و به اعتبارنامه‌ها (یعنی نام کاربری و رمز عبور، شماره تلفن یا اطلاعات ارائه‌دهنده تاییدیه) مرتبط می‌شود که کاربر با آن وارد شده است. این حساب جدید به‌عنوان بخشی از پروژه Firebase شما ذخیره می‌شود و می‌توان از آن برای شناسایی کاربر در همه برنامه‌های پروژه شما، صرف نظر از نحوه ورود کاربر به سیستم استفاده کرد.

  • در برنامه های خود، می توانید اطلاعات اولیه نمایه کاربر را از شی FirebaseUser دریافت کنید. به مدیریت کاربران مراجعه کنید.

  • در قوانین امنیتی Firebase Realtime Database و Cloud Storage خود، می‌توانید شناسه کاربری منحصر به فرد کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید با استفاده از چندین ارائه‌دهنده احراز هویت، با پیوند دادن اعتبار ارائه‌دهنده تأیید اعتبار به یک حساب کاربری موجود، به برنامه شما وارد شوند.

برای خروج از سیستم کاربر، signOut تماس بگیرید:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();