使用CredentialsClient保存Smart Lock凭证时遇SIGN_IN_REQUIRED错误求助
我之前用FirebaseUI的时候,能自动把应用新用户的邮箱和密码存到Smart Lock里,体验还不错。但因为FirebaseUI没法精确控制静默登录的账户——我需要用这个功能在设备上切换多用户,所以不得不把FirebaseUI移除了。
现在用CredentialsClient检索密码倒是没问题:会弹出对话框让我选账户,密码也能通过onActivityResult正常传给应用,这部分是完全按照Google的《检索用户存储的凭证》指南来做的。
但保存新的邮箱密码凭证时就一直卡壳,每次都会收到com.google.android.gms.common.api.CommonStatusCodes.SIGN_IN_REQUIRED错误,附带的消息是‘Passphrase required’,异常类型是com.google.android.gms.common.api.ApiException。
我的保存凭证代码如下:
CredentialsOptions options = new CredentialsOptions.Builder() .forceEnableSaveDialog() .build(); CredentialsClient mCredentialsClient = Credentials.getClient(MainActivity.activity, options); Credential credential = new Credential.Builder("email@example.com") .setPassword("dummy-password") .build(); mCredentialsClient.save(credential).addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { LogWrapper.i(TAG, "Credentials saved"); } else if (task.getException() instanceof ResolvableApiException) { ResolvableApiException rae = (ResolvableApiException) task.getException(); LogWrapper.e(TAG, "RAE EXCEPTION WHEN SAVING PASSWORD:", rae); } else { Exception e = task.getException(); LogWrapper.e(TAG, "EXCEPTION WHEN SAVING PASSWORD:", e); } } });
补充几个细节:
- 我的设备上有3个Google账号,其中一个配置了同步用的密码短语(passphrase),另外两个没有。我怀疑是不是这个导致的错误?但之前FirebaseUI完全能毫无问题地把凭证存到没设置密码短语的那个正确账户里,根本不用询问什么。
- 我还试过先通过FirebaseUI的Google登录登录到目标账户,再执行上面的保存代码,想让应用处于已登录该Google账号的状态来保存凭证,但结果还是一样的错误。
- 我对比过Firebase使用Smart Lock的实现方案,和我的代码没什么实质差异,基本和CredentialsQuickstart示例一致。
后来我更新了测试:下载编译了官方的CredentialsQuickstart示例,居然也遇到了同样的错误!测试设备是Android 10和Android 9。我现在有点怀疑,是不是Smart Lock这个API已经被AutoFill service取代了?我在设备的“语言和输入法”的“工具”里找到了Google的AutoFill Service选项,已经设置为那个没设密码短语的账户(就是之前FirebaseUI能正确存储凭证的那个),而且三星设备还会提供额外的AutoFill服务。
我的疑问
到底需要登录什么?为什么会出现这个‘Passphrase required’的错误?
内容的提问来源于stack exchange,提问作者Daniel F

