کاربر خود را با Credential Manager وارد کنید

Credential Manager یک رابط برنامه‌نویسی کاربردی (API) جت‌پک است که از روش‌های ورود چندگانه، مانند نام کاربری و رمز عبور، کلیدهای عبور و راه‌حل‌های ورود یکپارچه (مانند ورود با گوگل) در یک API واحد پشتیبانی می‌کند و در نتیجه ادغام را برای توسعه‌دهندگان ساده می‌کند.

علاوه بر این، برای کاربران، Credential Manager رابط ورود به سیستم را در بین روش‌های احراز هویت یکپارچه می‌کند و ورود به برنامه‌ها را برای کاربران، صرف نظر از روشی که انتخاب می‌کنند، واضح‌تر و آسان‌تر می‌کند.

این صفحه مفهوم کلیدهای عبور و مراحل پیاده‌سازی پشتیبانی سمت کلاینت برای راهکارهای احراز هویت، از جمله کلیدهای عبور، با استفاده از رابط برنامه‌نویسی مدیریت اعتبارنامه (Credential Manager API) را توضیح می‌دهد. همچنین یک صفحه پرسش و پاسخ جداگانه وجود دارد که به سوالات جزئی‌تر و خاص‌تر پاسخ می‌دهد.

درباره کلیدهای عبور

کلیدهای عبور جایگزین امن‌تر و آسان‌تری برای رمزهای عبور هستند. با استفاده از کلیدهای عبور، کاربران می‌توانند با استفاده از یک حسگر بیومتریک (مانند اثر انگشت یا تشخیص چهره)، پین یا الگو به برنامه‌ها و وب‌سایت‌ها وارد شوند. این یک تجربه ورود یکپارچه را فراهم می‌کند و کاربران شما را از به خاطر سپردن نام کاربری یا رمز عبور بی‌نیاز می‌کند.

کلیدهای عبور به WebAuthn (احراز هویت وب) متکی هستند، استانداردی که به طور مشترک توسط اتحاد FIDO و کنسرسیوم جهانی وب (W3C) توسعه داده شده است. WebAuthn از رمزنگاری کلید عمومی برای احراز هویت کاربر استفاده می‌کند. وب‌سایت یا برنامه‌ای که کاربر در آن وارد می‌شود می‌تواند کلید عمومی را ببیند و ذخیره کند، اما هرگز نمی‌تواند کلید خصوصی را ببیند. کلید خصوصی مخفی و ایمن نگه داشته می‌شود. و از آنجا که این کلید منحصر به فرد است و به وب‌سایت یا برنامه مرتبط است، کلیدهای عبور غیرقابل فیشینگ هستند و امنیت بیشتری را به همراه دارند.

مدیریت اعتبارنامه به کاربران اجازه می‌دهد تا کلیدهای عبور ایجاد کرده و آنها را در مدیریت رمز عبور گوگل ذخیره کنند.

برای راهنمایی در مورد نحوه پیاده‌سازی جریان‌های یکپارچه احراز هویت با کلید عبور با Credential Manager، بخش احراز هویت کاربر با کلیدهای عبور را مطالعه کنید.

پیش‌نیازها

برای استفاده از Credential Manager، مراحل این بخش را تکمیل کنید.

از نسخه جدید پلتفرم استفاده کنید

مدیریت اعتبارنامه (Credential Manager) در اندروید ۴.۴ (سطح API ۱۹) و بالاتر پشتیبانی می‌شود.

وابستگی‌ها را به برنامه خود اضافه کنید

برای استفاده از آخرین نسخه کتابخانه Credential Manager ، وابستگی‌های زیر را به اسکریپت ساخت ماژول برنامه خود اضافه کنید:

کاتلین

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-beta03")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-beta03")
}

شیار

dependencies {
    implementation "androidx.credentials:credentials:1.6.0-beta03"
    implementation "androidx.credentials:credentials-play-services-auth:1.6.0-beta03"
}

درباره نحوه کوچک کردن، مبهم‌سازی و بهینه‌سازی برنامه خود بیشتر بیاموزید.

اضافه شدن پشتیبانی از لینک‌های دارایی‌های دیجیتال

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

  1. یک فایل JSON با نام Digital Asset Links ایجاد کنید. برای مثال، برای اعلام اینکه وب‌سایت https://signin.example.com و یک برنامه اندروید با نام بسته com.example می‌توانند اعتبارنامه‌های ورود به سیستم را به اشتراک بگذارند، فایلی با نام assetlinks.json با محتوای زیر ایجاد کنید:

    [
      {
        "relation" : [
          "delegate_permission/common.handle_all_urls",
          "delegate_permission/common.get_login_creds"
        ],
        "target" : {
          "namespace" : "android_app",
          "package_name" : "com.example.android",
          "sha256_cert_fingerprints" : [
            SHA_HEX_VALUE
          ]
        }
      }
    ]
    

    فیلد relation ، آرایه‌ای از یک یا چند رشته است که رابطه‌ی اعلام‌شده را توصیف می‌کند. برای اعلام اینکه برنامه‌ها و سایت‌ها اعتبارنامه‌های ورود به سیستم را به اشتراک می‌گذارند، روابط را به صورت delegate_permission/handle_all_urls و delegate_permission/common.get_login_creds مشخص کنید.

    فیلد target ، شیء‌ای است که دارایی مورد نظر برای اعلان را مشخص می‌کند. فیلدهای زیر یک وب‌سایت را مشخص می‌کنند:

    namespace web
    site

    آدرس اینترنتی وب‌سایت، با فرمت https:// domain [: optional_port ] ؛ برای مثال، https://www.example.com .

    domain باید کاملاً واجد شرایط باشد و هنگام استفاده از پورت ۴۴۳ برای HTTPS، optional_port باید حذف شود.

    یک هدف site فقط می‌تواند یک دامنه ریشه باشد: شما نمی‌توانید ارتباط یک برنامه را به یک زیرشاخه خاص محدود کنید. در URL مسیری مانند اسلش انتهایی را وارد نکنید.

    زیردامنه‌ها مطابقت در نظر گرفته نمی‌شوند: یعنی اگر domain را www.example.com مشخص کنید، دامنه www.counter.example.com با برنامه شما مرتبط نیست.

    فیلدهای زیر یک برنامه اندروید را شناسایی می‌کنند:

    namespace android_app
    package_name نام بسته‌ای که در مانیفست برنامه اعلام شده است. برای مثال، com.example.android
    sha256_cert_fingerprints اثر انگشت‌های SHA256 مربوط به گواهی امضای برنامه شما.
  2. فایل JSON مربوط به دارایی‌های دیجیتال را در محل زیر در دامنه‌ی ورود به سیستم میزبانی کنید:

    https://domain[:optional_port]/.well-known/assetlinks.json
    

    برای مثال، اگر دامنه ورود شما signin.example.com است، فایل JSON را در https://signin.example.com/.well-known/assetlinks.json میزبانی کنید.

    نوع MIME برای فایل Digital Assets Link باید JSON باشد. تأیید کنید که سرور در پاسخ، هدر Content-Type: application/json را ارسال می‌کند.

  3. تأیید کنید که میزبان شما به گوگل اجازه می‌دهد فایل Digital Asset Link شما را بازیابی کند. اگر فایل robots.txt دارید، باید به عامل Googlebot اجازه دهد /.well-known/assetlinks.json را بازیابی کند. اکثر سایت‌ها می‌توانند به هر عامل خودکار اجازه دهند فایل‌های موجود در مسیر /.well-known/ را بازیابی کند تا سایر سرویس‌ها بتوانند به فراداده‌های موجود در آن فایل‌ها دسترسی پیدا کنند:

    User-agent: *
    Allow: /.well-known/
    
  4. خط زیر را به فایل مانیفست در زیر <application> اضافه کنید:

    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
    
  5. اگر از طریق Credential Manager با رمز عبور وارد سیستم می‌شوید، این مرحله را برای پیکربندی پیوند دارایی‌های دیجیتال در مانیفست دنبال کنید. اگر فقط از کلیدهای عبور استفاده می‌کنید، این مرحله لازم نیست.

    این ارتباط را در برنامه اندروید تعریف کنید. یک شیء اضافه کنید که فایل‌های assetlinks.json را برای بارگذاری مشخص کند. شما باید از هرگونه آپاستروف و علامت نقل قول که در رشته استفاده می‌کنید، صرف نظر کنید. برای مثال:

    <string name="asset_statements" translatable="false">
    [{
      \"include\": \"https://signin.example.com/.well-known/assetlinks.json\"
    }]
    </string>
    
    > GET /.well-known/assetlinks.json HTTP/1.1
    > User-Agent: curl/7.35.0
    > Host: signin.example.com
    
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    

پیکربندی مدیریت اعتبارنامه‌ها

برای پیکربندی و مقداردهی اولیه یک شیء CredentialManager ، منطقی مشابه موارد زیر اضافه کنید:

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

فیلدهای اعتبارنامه را مشخص کنید

در اندروید ۱۴ و بالاتر، می‌توان از ویژگی isCredential برای نشان دادن فیلدهای اعتبارنامه، مانند فیلدهای نام کاربری یا رمز عبور، استفاده کرد. این ویژگی نشان می‌دهد که این نما یک فیلد اعتبارنامه است که برای کار با Credential Manager و ارائه‌دهندگان اعتبارنامه شخص ثالث در نظر گرفته شده است، ضمن اینکه به سرویس‌های تکمیل خودکار کمک می‌کند تا پیشنهادهای تکمیل خودکار بهتری ارائه دهند. هنگامی که برنامه از API Credential Manager استفاده می‌کند، برگه پایانی Credential Manager با اعتبارنامه‌های موجود نمایش داده می‌شود و دیگر نیازی به نمایش کادر محاوره‌ای تکمیل خودکار برای نام کاربری یا رمز عبور نیست. به طور مشابه، نیازی به نمایش کادر محاوره‌ای ذخیره خودکار برای رمزهای عبور نیست، زیرا برنامه از API Credential Manager برای ذخیره اعتبارنامه‌ها درخواست خواهد کرد.

برای استفاده از ویژگی isCredential ، آن را به Viewهای مربوطه اضافه کنید:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:isCredential="true" />

کاربر خود را وارد کنید

برای بازیابی تمام گزینه‌های رمز عبور و کلید عبور مرتبط با حساب کاربری، این مراحل را انجام دهید:

  1. گزینه‌های تأیید اعتبار رمز عبور و کلید عبور را مقداردهی اولیه کنید:

    // Get password logins from the credential provider on the user's device.
    val getPasswordOption = GetPasswordOption()
    
    // Get passkeys from the credential provider on the user's device.
    val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
        requestJson = requestJson
    )
          
  2. از گزینه‌های بازیابی‌شده از مرحله قبل برای ساخت درخواست ورود به سیستم استفاده کنید.

    val credentialRequest = GetCredentialRequest(
        // Include all the sign-in options that your app supports.
        listOf(getPasswordOption, getPublicKeyCredentialOption),
        // Defines whether you prefer to use only immediately available
        // credentials or hybrid credentials.
        preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials
    )
          
  3. جریان ورود به سیستم را راه‌اندازی کنید:

    coroutineScope {
        try {
            result = credentialManager.getCredential(
                // Use an activity-based context to avoid undefined system UI
                // launching behavior.
                context = activityContext,
                request = credentialRequest
            )
            handleSignIn(result)
        } catch (e: GetCredentialException) {
            // Handle failure
        }
    }
        
    fun handleSignIn(result: GetCredentialResponse) {
        // Handle the successfully returned credential.
        val credential = result.credential
    
        when (credential) {
            is PublicKeyCredential -> {
                val responseJson = credential.authenticationResponseJson
                // Share responseJson i.e. a GetCredentialResponse on your server to
                // validate and  authenticate
            }
    
            is PasswordCredential -> {
                val username = credential.id
                val password = credential.password
                // Use id and password to send to your server to validate
                // and authenticate
            }
    
            is CustomCredential -> {
                // If you are also using any external sign-in libraries, parse them
                // here with the utility functions provided.
                if (credential.type == ExampleCustomCredential.TYPE) {
                    try {
                        val ExampleCustomCredential =
                            ExampleCustomCredential.createFrom(credential.data)
                        // Extract the required credentials and complete the authentication as per
                        // the federated sign in or any external sign in library flow
                    } catch (e: ExampleCustomCredential.ExampleCustomCredentialParsingException) {
                        // Unlikely to happen. If it does, you likely need to update the dependency
                        // version of your external sign-in library.
                        Log.e(TAG, "Failed to parse an ExampleCustomCredential", e)
                    }
                } else {
                    // Catch any unrecognized custom credential type here.
                    Log.e(TAG, "Unexpected type of credential")
                }
            }
            else -> {
                // Catch any unrecognized credential type here.
                Log.e(TAG, "Unexpected type of credential")
            }
        }
    }
        

مثال زیر نحوه قالب‌بندی درخواست JSON را هنگام دریافت رمز عبور نشان می‌دهد:

{
  "challenge": "T1xCsnxM2DNL2KdK5CLa6fMhD7OBqho6syzInk_n-Uo",
  "allowCredentials": [],
  "timeout": 1800000,
  "userVerification": "required",
  "rpId": "https://passkeys-codelab.glitch.me/"
}

مثال زیر نشان می‌دهد که چگونه یک پاسخ JSON ممکن است پس از دریافت اعتبارنامه کلید عمومی، از شما مراقبت کند:

{
  "id": "<credential ID>",
  "type": "public-key",
  "rawId": "<raw credential ID>",
  "response": {
    "clientDataJSON": "<signed client data containing challenge>",
    "authenticatorData": "<authenticator metadata>",
    "signature": "<digital signature to be verified>",
    "userHandle": "<user ID from credential registration>"
  }
}

مدیریت استثنائات زمانی که هیچ اعتبارنامه‌ای در دسترس نیست

در برخی موارد، ممکن است کاربر هیچ اعتبارنامه‌ای در دسترس نداشته باشد، یا ممکن است کاربر رضایت خود را برای استفاده از اعتبارنامه موجود اعلام نکند. اگر getCredential() فراخوانی شود و هیچ اعتبارنامه‌ای یافت نشود، خطای NoCredentialException برگردانده می‌شود. در این صورت، کد شما باید نمونه‌های NoCredentialException را مدیریت کند.

coroutineScope {
    try {
        result = credentialManager.getCredential(
            context = activityContext,
            request = credentialRequest
        )
    } catch (e: GetCredentialException) {
        Log.e("CredentialManager", "No credential available", e)
    }
}

در اندروید ۱۴ یا بالاتر، می‌توانید با استفاده از متد prepareGetCredential() قبل از فراخوانی getCredential() ، تأخیر هنگام نمایش انتخابگر حساب را کاهش دهید.

coroutineScope {
    val response = credentialManager.prepareGetCredential(
        GetCredentialRequest(
            listOf(
                // Include all the sign-in options that your app supports
                getPublicKeyCredentialOption, 
                getPasswordOption
            )
        )
    )
}

متد prepareGetCredential() عناصر رابط کاربری را فراخوانی نمی‌کند. این متد فقط به شما کمک می‌کند تا کار آماده‌سازی را انجام دهید تا بتوانید بعداً عملیات دریافت اعتبارنامه (که شامل رابط‌های کاربری می‌شود) را از طریق API مربوط به getCredential() اجرا کنید.

داده‌های ذخیره‌شده در یک شیء PrepareGetCredentialResponse بازگردانده می‌شوند. اگر اعتبارنامه‌های موجود وجود داشته باشند، نتایج ذخیره می‌شوند و می‌توانید بعداً API مربوط به getCredential() را اجرا کنید تا انتخابگر حساب را با داده‌های ذخیره‌شده نمایش دهد.

جریان‌های ثبت نام

شما می‌توانید با استفاده از کلید عبور یا رمز عبور ، یک کاربر را برای احراز هویت ثبت کنید.

ایجاد کلید عبور

برای اینکه به کاربران این امکان را بدهید که یک رمز عبور ثبت کنند و از آن برای احراز هویت مجدد استفاده کنند، با استفاده از شیء CreatePublicKeyCredentialRequest یک اعتبارنامه کاربری ثبت کنید.

suspend fun createPasskey(requestJson: String, preferImmediatelyAvailableCredentials: Boolean) {
    var isConditional: Boolean = false
    val createPublicKeyCredentialRequest = CreatePublicKeyCredentialRequest(
        // Contains the request in JSON format.
        requestJson = requestJson,
        // Defines whether you prefer to use only locally-available
        // credentials or hybrid credentials.
        preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials,
        // Automatically create a passkey if the user does not have one.
        isConditional = isConditional
    )

    // Execute createCredential asynchronously to register credentials
    // for a user account.
    coroutineScope {
        try {
            val result = credentialManager.createCredential(
                // Use an activity-based context to avoid undefined system
                // UI launching behavior
                context = activityContext,
                request = createPublicKeyCredentialRequest,
            )
            //  Handle passkey creation result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}
fun handleFailure(e: CreateCredentialException) {
    when (e) {
        is CreatePublicKeyCredentialDomException -> {
            // Handle the passkey DOM errors thrown according to the
            // WebAuthn spec.
        }
        is CreateCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to register the credential.
        }
        is CreateCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is CreateCredentialProviderConfigurationException -> {
            // Your app is missing the provider configuration dependency.
            // Most likely, you're missing the
            // "credentials-play-services-auth" module.
        }
        is CreateCredentialCustomException -> {
            // You have encountered an error from a 3rd-party SDK. If you
            // make the API call with a request object that's a subclass of
            // CreateCustomCredentialRequest using a 3rd-party SDK, then you
            // should check for any custom exception type constants within
            // that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java.name}")
    }
}

درخواست JSON را قالب‌بندی کنید

پس از ایجاد کلید عبور، باید آن را به حساب کاربری مرتبط کنید و کلید عمومی کلید عبور را در سرور خود ذخیره کنید. نمونه کد زیر نحوه قالب‌بندی درخواست JSON هنگام ایجاد کلید عبور را نشان می‌دهد.

این پست وبلاگ در مورد آوردن احراز هویت یکپارچه به برنامه‌هایتان، به شما نشان می‌دهد که چگونه هنگام ایجاد کلیدهای عبور و هنگام احراز هویت با استفاده از کلیدهای عبور، درخواست JSON خود را قالب‌بندی کنید. همچنین توضیح می‌دهد که چرا رمزهای عبور یک راه حل مؤثر برای احراز هویت نیستند، چگونه از اعتبارنامه‌های بیومتریک موجود استفاده کنید، چگونه برنامه خود را با وب‌سایتی که متعلق به شماست مرتبط کنید، چگونه کلیدهای عبور ایجاد کنید و چگونه با استفاده از کلیدهای عبور احراز هویت کنید.

{
  "challenge": "<base64url-encoded challenge>",
  "rp": {
    "name": "<relying party name>",
    "id": "<relying party host name>"
  },
  "user": {
    "id": "<base64url-encoded user ID>",
    "name": "<user name>",
    "displayName": "<user display name>"
  },
  "pubKeyCredParams": [
    {
      "type": "public-key",
      "alg": -7
    }
  ],
  "attestation": "none",
  "excludeCredentials": [
    {
        "id": "<base64url-encoded credential ID to exclude>", 
        "type": "public-key"
    }
  ],
  "authenticatorSelection": {
    "requireResidentKey": true,
    "residentKey": "required",
    "userVerification": "required"
  }
}

مقادیر را برای authenticatorAttachment تنظیم کنید

پارامتر authenticatorAttachment فقط می‌تواند در زمان ایجاد اعتبارنامه تنظیم شود. می‌توانید platform ، cross-platform یا بدون مقدار را مشخص کنید. در بیشتر موارد، بدون مقدار توصیه می‌شود.

  • platform : برای ثبت دستگاه فعلی کاربر یا درخواست ارتقاء به رمز عبور پس از ورود به سیستم، authenticatorAttachment روی platform تنظیم کنید.
  • cross-platform : این مقدار معمولاً هنگام ثبت اعتبارنامه‌های چند عاملی استفاده می‌شود و در زمینه رمز عبور کاربرد ندارد.
  • بدون مقدار : برای اینکه کاربران بتوانند در دستگاه‌های مورد نظر خود رمز عبور ایجاد کنند (مانند تنظیمات حساب کاربری)، پارامتر authenticatorAttachment نباید هنگام انتخاب رمز عبور توسط کاربر مشخص شود. در بیشتر موارد، مشخص نکردن پارامتر بهترین گزینه است.

جلوگیری از ایجاد رمزهای عبور تکراری

شناسه‌های اعتبارنامه را در آرایه اختیاری excludeCredentials فهرست کنید تا در صورت وجود کلید عبور جدید با همان ارائه‌دهنده کلید عبور، از ایجاد آن جلوگیری شود.

مدیریت پاسخ JSON

قطعه کد زیر نمونه‌ای از یک پاسخ JSON برای ایجاد یک اعتبارنامه کلید عمومی را نشان می‌دهد. درباره نحوه مدیریت اعتبارنامه کلید عمومی بازگردانده شده بیشتر بدانید.

{
  "id": "<identifier>",
  "type": "public-key",
  "rawId": "<identifier>",
  "response": {
    "clientDataJSON": "<ArrayBuffer encoded object with the origin and signed challenge>",
    "attestationObject": "<ArrayBuffer encoded object with the public key and other information.>"
  },
  "authenticatorAttachment": "platform"
}

تأیید مبدأ از داده‌های کلاینت JSON

origin نشان‌دهنده‌ی برنامه یا وب‌سایتی است که درخواست از آن می‌آید و توسط کلیدهای عبور برای محافظت در برابر حملات فیشینگ استفاده می‌شود. سرور برنامه‌ی شما موظف است مبدأ داده‌های کلاینت را با فهرستی از برنامه‌ها و وب‌سایت‌های تأیید شده مقایسه کند. اگر سرور درخواستی از یک برنامه یا وب‌سایت از یک مبدأ ناشناخته دریافت کند، درخواست باید رد شود.

در مورد وب، origin همان سایت مبدایی را نشان می‌دهد که اعتبارنامه در آن وارد شده است. برای مثال، با توجه به URL https://www.example.com:8443/store?category=shoes#athletic ، origin https://www.example.com:8443 است.

برای برنامه‌های اندروید، عامل کاربر به طور خودکار origin با امضای برنامه فراخوانی تنظیم می‌کند. این امضا باید به عنوان یک تطابق در سرور شما تأیید شود تا فراخوانی‌کننده API کلید عبور اعتبارسنجی شود. origin اندروید یک URI است که از هش SHA-256 گواهی امضای APK مشتق شده است، مانند:

android:apk-key-hash:<sha256_hash-of-apk-signing-cert>

هش‌های SHA-256 گواهی‌های امضای یک فروشگاه کلید را می‌توان با اجرای دستور ترمینال زیر پیدا کرد:

keytool -list -keystore <path-to-apk-signing-keystore>

هش‌های SHA-256 در قالب هگزادسیمال با جداکننده‌ی دو نقطه ( 91:F7:CB:F9:D6:81… ) هستند و مقادیر origin اندروید با base64url کدگذاری شده‌اند. این مثال پایتون نحوه‌ی تبدیل قالب هش به یک قالب هگزادسیمال سازگار و جداکننده‌ی دو نقطه را نشان می‌دهد:

import binascii
import base64
fingerprint = '91:F7:CB:F9:D6:81:53:1B:C7:A5:8F:B8:33:CC:A1:4D:AB:ED:E5:09:C5'
print("android:apk-key-hash:" + base64.urlsafe_b64encode(binascii.a2b_hex(fingerprint.replace(':', ''))).decode('utf8').replace('=', ''))

مقدار fingerprint را با مقدار دلخواه خود جایگزین کنید. در اینجا یک مثال از نتیجه را مشاهده می‌کنید:

android:apk-key-hash:kffL-daBUxvHpY-4M8yhTavt5QnFEI2LsexohxrGPYU

سپس می‌توانید آن رشته را به عنوان یک مبدأ مجاز در سرور خود مطابقت دهید. اگر چندین گواهی امضا دارید، مانند گواهی‌های اشکال‌زدایی و انتشار، یا چندین برنامه، این فرآیند را تکرار کنید و همه آن مبدأها را به عنوان معتبر در سرور بپذیرید.

ذخیره رمز عبور کاربر

اگر کاربر نام کاربری و رمز عبوری را برای جریان احراز هویت در برنامه شما ارائه دهد، می‌توانید یک اعتبارنامه کاربر ثبت کنید که می‌تواند برای احراز هویت کاربر استفاده شود. برای انجام این کار، یک شیء CreatePasswordRequest ایجاد کنید:

suspend fun registerPassword(username: String, password: String) {
    // Initialize a CreatePasswordRequest object.
    val createPasswordRequest =
        CreatePasswordRequest(id = username, password = password)

    // Create credential and handle result.
    coroutineScope {
        try {
            val result =
                credentialManager.createCredential(
                    // Use an activity based context to avoid undefined
                    // system UI launching behavior.
                    activityContext,
                    createPasswordRequest
                )
            // Handle register password result
        } catch (e: CreateCredentialException) {
            handleFailure(e)
        }
    }
}

پشتیبانی از بازیابی اعتبارنامه

اگر کاربری دیگر به دستگاهی که اطلاعات کاربری خود را در آن ذخیره کرده است دسترسی ندارد، ممکن است نیاز به بازیابی از طریق یک نسخه پشتیبان آنلاین امن داشته باشد. برای کسب اطلاعات بیشتر در مورد نحوه پشتیبانی از این فرآیند بازیابی اطلاعات کاربری، بخش «بازیابی دسترسی یا افزودن دستگاه‌های جدید» را در این پست وبلاگ بخوانید: امنیت کلیدهای عبور در مدیریت رمز عبور گوگل .

ایجاد خودکار رمز عبور برای کاربران

اگر کاربری رمز عبور ندارد، می‌توانید دفعه‌ی بعد که وارد سیستم می‌شود، با استفاده از رمز عبوری که در مدیریت رمز عبورش ذخیره شده است، به طور خودکار از طرف او رمز عبور ایجاد کنید. این کار را با تنظیم فیلد isConditionalCreateRequest هنگام درخواست اعتبارنامه‌های عمومی انجام دهید:

CreatePublicKeyCredentialRequest(
    // other parameters
    isConditionalCreateRequest: Boolean = true
)

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

این ویژگی به نسخه ۱.۶.۰-alpha01 یا بالاتر نیاز دارد.

پشتیبانی از ابزارهای مدیریت رمز عبور با کلیدهای عبور و URLهای شناخته شده را اضافه کنید

برای یکپارچه‌سازی یکپارچه و سازگاری آینده با ابزارهای مدیریت رمز عبور و اعتبارنامه، توصیه می‌کنیم پشتیبانی از کلیدهای عبور و URLهای شناخته‌شده را به نقاط پایانی اضافه کنید. این یک پروتکل باز برای طرفین همسو است تا به‌طور رسمی حمایت خود را از کلیدهای عبور اعلام کنند و لینک‌های مستقیمی برای ثبت‌نام و مدیریت کلید عبور ارائه دهند.

  1. برای یک طرف متکی به آدرس https://example.com که دارای وب‌سایت و اپلیکیشن‌های اندروید و iOS است، آدرس اینترنتی شناخته‌شده https://example.com/.well-known/passkey-endpoints خواهد بود.
  2. وقتی URL مورد پرسش قرار می‌گیرد، پاسخ باید از طرحواره زیر استفاده کند.

    {
      "enroll": "https://example.com/account/manage/passkeys/create"
      "manage": "https://example.com/account/manage/passkeys"
    }
    
  3. برای اینکه این لینک به جای باز شدن در وب، مستقیماً در برنامه شما باز شود، از پیوندهای برنامه اندروید استفاده کنید.

  4. جزئیات بیشتر را می‌توانید در راهنمای URL معروف passkey endpoints در GitHub بیابید.

با نشان دادن اینکه کدام ارائه‌دهنده، رمزهای عبور را ایجاد کرده است، به کاربران در مدیریت آنها کمک کنید

یکی از چالش‌هایی که کاربران هنگام مدیریت چندین کلید عبور مرتبط با یک برنامه خاص با آن مواجه هستند، شناسایی کلید عبور صحیح برای ویرایش یا حذف است. برای کمک به این مشکل، توصیه می‌شود برنامه‌ها و وب‌سایت‌ها اطلاعات اضافی مانند ارائه‌دهنده‌ای که اعتبارنامه را ایجاد کرده، تاریخ ایجاد و آخرین تاریخ استفاده را در لیست کلیدهای عبور در صفحه تنظیمات برنامه خود قرار دهند. اطلاعات ارائه‌دهنده با بررسی AAGUID مرتبط با کلید عبور مربوطه به دست می‌آید. AAGUID را می‌توان به عنوان بخشی از داده‌های تأییدکننده کلید عبور یافت.

برای مثال، اگر کاربری با استفاده از Google Password Manager یک رمز عبور در دستگاه اندروید ایجاد کند، RP یک AAGUID دریافت می‌کند که چیزی شبیه به این است: "ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4". طرف اعتمادکننده می‌تواند رمز عبور را در لیست رمز عبور حاشیه‌نویسی کند تا نشان دهد که با استفاده از Google Password Manager ایجاد شده است.

برای نگاشت یک AAGUID به یک ارائه‌دهنده کلید عبور، RPها می‌توانند از یک مخزن AAGUID که توسط جامعه تهیه شده است استفاده کنند. برای یافتن نام و نماد ارائه‌دهنده کلید عبور، AAGUID را در لیست جستجو کنید.

درباره ادغام AAGUID بیشتر بخوانید.

عیب‌یابی خطاهای رایج

برای کدهای خطای رایج، توضیحات و اطلاعات مربوط به علل آنها، به راهنمای عیب‌یابی Credential Manager مراجعه کنید.

منابع اضافی

برای کسب اطلاعات بیشتر در مورد API و کلیدهای عبور Credential Manager، به منابع زیر مراجعه کنید: