我正在尝试通过 OAuth2.0 在我的 Android 应用程序中请求 Gmail
readonly
同意。
使用旧的 Google SignIn API 有许多可用的解决方案,但它将被弃用,而 Credential Manager API https://developer.android.com/training/sign-in/credential-manager 现在是首选方法。
我已成功创建
Android
凭据并拥有客户端 ID,
我还可以使用以下代码启动系统生成的底页
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(filterByAuthorizedAccounts)
.setServerClientId(CLIENT_ID)
//.setNonce("<nonce string to use when generating a Google ID token>")
.build()
val credentialManager = CredentialManager.create(this)
val request =
GetCredentialRequest.Builder().addCredentialOption(googleIdOption).build()
lifecycleScope.launch {
try {
withContext(Dispatchers.IO) {
val result = credentialManager.getCredential(this@HomeActivity, request)
handleSignIn(result)
}
} catch (e: NoCredentialException) {
Timber.e(e)
} catch (e: GetCredentialException) {
Timber.e(e)
}
}
但是一旦我选择一个帐户(也在云项目下添加为测试用户)并继续,就会抛出错误,而不是通常在身份验证后出现的同意屏幕。
androidx.credentials.exceptions.GetCredentialCustomException: Developer console is not set up correctly.
at androidx.credentials.CredentialProviderFrameworkImpl.convertToJetpackGetException$credentials_release(CredentialProviderFrameworkImpl.kt:291)
at androidx.credentials.CredentialProviderFrameworkImpl$onGetCredential$outcome$2.onError(CredentialProviderFrameworkImpl.kt:152)
at androidx.credentials.CredentialProviderFrameworkImpl$onGetCredential$outcome$2.onError(CredentialProviderFrameworkImpl.kt:143)
at android.credentials.CredentialManager$GetCredentialTransport.lambda$onError$2(CredentialManager.java:694)
at android.credentials.CredentialManager$GetCredentialTransport.$r8$lambda$nlbYav9mLBoE6Yh1vFKCvITF3ks(Unknown Source:0)
at android.credentials.CredentialManager$GetCredentialTransport$$ExternalSyntheticLambda2.run(Unknown Source:6)
at androidx.credentials.CredentialManager$$ExternalSyntheticLambda0.execute(D8$$SyntheticClass:0)
at android.credentials.CredentialManager$GetCredentialTransport.onError(CredentialManager.java:693)
at android.credentials.IGetCredentialCallback$Stub.onTransact(IGetCredentialCallback.java:123)
at android.os.Binder.execTransactInternal(Binder.java:1363)
at android.os.Binder.execTransact(Binder.java:1304)
是的,我已经多次检查过
package-name
和SHA-1
指纹,还为..gmail.readonly
范围配置了同意屏幕。[未提交验证,因为正在测试中]。并且没有提到在投入生产之前需要验证才能工作。
我尝试的另一件事是将
Android Client Id
替换为 Web application Client Id
。不过,它确实允许我登录,但之后没有同意屏幕。
到目前为止,我认为在新的凭据管理器 API 中,启动同意屏幕是由 API 本身处理的,而且我无法在相应的包中找到相关的代码或方法。
这里缺少什么?
CredentialManager 不支持使用任何类型的 OAuth 授权(与身份验证相比)。对于授权,您需要直接使用Authorization APIS;这些 API 是 play-service 的身份验证库的一部分。如果您在使用这些 API 时遇到任何问题,请随时发布问题。