Java Android FIDO2PendingEvent()。LaunchPendingEvent第一次失败,并连续工作多次

Java Android FIDO2PendingEvent()。LaunchPendingEvent第一次失败,并连续工作多次,java,android,fido,Java,Android,Fido,为什么谷歌的fido2pendingent().launchpendingent方法在第一次尝试时失败(没有显示指纹/密码提示),错误代码为: SECURITY_ERR - The operation is insecure. The incoming request cannot be validated. 而且,连续尝试通常会导致上述呼叫正常工作(显示指纹/密码提示),并且不再出现此错误 以下是代码的主要片段: ListenerRegistration.java: try {

为什么谷歌的
fido2pendingent().launchpendingent
方法在第一次尝试时失败(没有显示指纹/密码提示),错误代码为:

SECURITY_ERR - The operation is insecure. The incoming request cannot be validated.
而且,连续尝试通常会导致上述呼叫正常工作(显示指纹/密码提示),并且不再出现此错误

以下是代码的主要片段:

ListenerRegistration.java:

    try {
        // Get intent for FIDO2 operation.
        Fido2ApiClient fido2ApiClient = Fido.getFido2ApiClient( this.activity );
        Task<Fido2PendingIntent> task = fido2ApiClient.getRegisterIntent( pkcco );

        // Send intent back to UI through callback.
        Log.d( TAG, "LISTENERREGISTRATION.java IS NOW ATTEMPTING TO OPEN FINGERPRINT/SECRUITY PROMPT" );
        this.fidoDelegate.launchFidoPrompt( Tasks.await( task ), FidoPromptCallback.FIDO2_REGISTRATION );

        // Wait for authenticator to complete.
        this.fidoAuthenticatorLock.acquire();
    } catch( ExecutionException e ) {
        // Threw exception while waiting for authenticator.
        // Pass Fido2AuthenticatorException back to calling class so it can handle error appropriately.
        throw new Fido2AuthenticatorException( this.sFido2AuthenticatorErrorMessage, this.fido2ErrorCode );
    } catch( InterruptedException e ) {
        // Threw exception while waiting for authenticator.
        // Pass Fido2AuthenticatorException back to calling class so it can handle error appropriately.
        throw new Fido2AuthenticatorException( this.sFido2AuthenticatorErrorMessage, this.fido2ErrorCode );
    }
失败(和成功)时,日志如下所示(因为即使在获得
SECURITY\u ERR
错误后,也不会引发异常):

我的代码没有收到任何异常通知这一事实使我相信问题在于调用
fido2pendingent().launchpendingent


请注意,除此代码中的区域外:

我也面临相同的错误,您是否能够解决此问题?如果是的话,请你提供一些我可能缺少的细节。我们已经正确地托管了assets.json文件。hi@bkasturiwale我还没有完全解决这个问题,但是我已经实现了一个简单的解决方法,即在FIDO2提示符打开失败时自动重试。这个想法是,如果它失败了,通常会在第一次或第二次失败。因此,连续的尝试应该会成功。通过实现自动重试,理论上您永远不必面对这个问题(自从实现此解决方案以来,我再也没有遇到过这个问题)hi@Matthcw,感谢您提供的评论。是的,我已经实现了自动重试,是的,在一次或两次尝试后,它可以工作。但对于这些尝试,它会显示FIDO活动片刻,并将其带回我们的屏幕,从而为最终用户提供一个浮华的视图。您是否观察到了同样的情况,或者在我们为待定意图设置的选项中,有一个重试选项。@bCasturiWale您的方法与我的方法完全相同。然而,我在后台看到的是一个小的加载屏幕,当FIDO提示符打开时,它指示应用程序的状态。因此(1)当FIDO屏幕第一次打开时,它会显示“启动FIDO提示符”;(2)如果FIDO提示符失败,它会显示“FIDO失败,重试…”。所有这些都显示在你所说的浮华的屏幕后面,以便让用户随时了解情况。
       // Instantiate class to handle VC functionality called by listener.
       this.lo = new ListenerOperations(MainActivity.this, new FidoPromptCallback() {
        @Override
        public void launchFidoPrompt(Fido2PendingIntent fido2Intent, int iOperation) {
            // Determine how to handle authenticator result.
            int iCode;
            if (iOperation == FidoPromptCallback.FIDO2_REGISTRATION) {
                iCode = MainActivity.REQUEST_FIDO2_REGISTER;
            } else if (iOperation == FidoPromptCallback.FIDO2_ASSERTION) {
                iCode = MainActivity.REQUEST_FIDO2_ASSERTION;
            } else {
                // Invalid operation.
                iCode = -1;
            }

            try {
                // Launch the fingerprint dialog by launching the intent from FIDO2 API.
                Log.d( TAG, "MAINACTIVITY.java IS NOW ATTEMPTING TO OPEN FINGERPRINT/SECRUITY PROMPT" );
                fido2Intent.launchPendingIntent( MainActivity.this, iCode );
                Log.d( TAG, "MAINACTIVITY.java HAS OPENNED FINGERPRINT/SECRUITY PROMPT WITH NO ERRORS" );

            } catch( IntentSender.SendIntentException e ) {
                // Error launching pending intent for register request.
                Log.d(TAG, "SADFACE - FAILED TO OPEN FINGERPRINT FIDO DIALOG");
            } catch (Exception e) {
                Log.d( TAG, "GENERAL EXCEPTION OCCURRED WHEN CALLING fido2Intent.launchPendingIntent" );
                e.printStackTrace();
            }
            Log.d( TAG, "MAINACTIVITY.java END OF launchFidoPrompt()" );
        }
other logs
...
10-01 10:31:36.289 14272 15728 D MainActivity.java: LISTENERREGISTRATION.java IS NOW ATTEMPTING TO OPEN FINGERPRINT/SECRUITY PROMPT
...
10-01 10:31:37.589 14974 15728 D MainActivity.java: MAINACTIVITY.java IS NOW ATTEMPTING TO OPEN FINGERPRINT/SECRUITY PROMPT
10-01 10:31:37.602  4053  4953 I ActivityManager: START u0 {act=null typ=null flg=0x0 cmp=ComponentInfo{com.google.android.gms/com.google.android.gms.fido.fido2.ui.Fido2FullScreenActivity}} from uid 10031
10-01 10:31:37.623  4053  4953 D CustomFrequencyManagerService: acquireDVFSLockLocked : type : DVFS_MIN_LIMIT  frequency : 1560000  uid : 1000  pid : 4053  pkgName : AMS_APP_SWITCH@CPU_MIN@47
10-01 10:31:37.625  4053  4953 D ActivityManagerPerformance: AMP_acquire() APP_SWITCH
10-01 10:31:37.628  3633  3633 I SurfaceFlinger: id=56380 createSurf (3040x3040),2 flag=4, AppWindowToken{2800ead token=Token{77b3fc4 ActivityRecord{44bad7 u0 com.google.android.gms/.fido.fido2.ui.Fido2FullScreenActivity t7062}}}#0
10-01 10:31:37.636  4053  4953 D ActivityManager: Received ACTIVITY intent in key u0 {bcd25e2 act=nullstartActivity cmp=ComponentInfo{com.google.android.gms/com.google.android.gms.fido.fido2.ui.Fido2FullScreenActivity} res=0} from uid 10218
10-01 10:31:37.637 14974 15728 D MainActivity.java: MAINACTIVITY.java HAS OPENNED FINGERPRINT/SECRUITY PROMPT WITH NO ERRORS
10-01 10:31:37.637 14974 15728 D MainActivity.java: MAINACTIVITY.java END OF launchFidoPrompt()