使用 Jetpack Compose 登录 CredentialManager 时出现 Google 错误

问题描述 投票:0回答:1

我正在尝试创建一个“使用 Google 按钮登录”,但每次调用 credentialManager.getCredential 时,它都会给我:

androidx.credentials.exceptions.NoCredentialException:开始登录期间,一键失败响应:10:开发者控制台设置不正确。

我尝试重置 SHA-1 指纹,我在谷歌云凭证中创建了 Web 应用程序和 Android,我使用了 Web 应用程序客户端 ID 和 Android 客户端 ID。我迷路了,请帮忙


object DeveloperScreen{

    const val GOOGLE_WEB_CLIENT_ID = "xxxxxxxxxh5n94bxxxxxxxxxxx1.apps.googleusercontent.com"
//    const val GOOGLE_WEB_CLIENT_SECRET = "GxxxxxxxxCinwYDR8KQi3-wD9ugT311"
//    const val GOOGLE_ANDROID_CLIENT_ID = "3xxxxxxx80-7ja1n9nknxxxxxxxxxxxxxxxxxxxens33k.apps.googleusercontent.com"


    private suspend fun googleSignIn(context : Context) {


        val credentialManager = androidx.credentials.CredentialManager.create(context)

        val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
            .setFilterByAuthorizedAccounts(false)
            .setServerClientId(GOOGLE_WEB_CLIENT_ID)
            .build()

        Log.i("auth-google-googleIdOption", googleIdOption.toString())

        val request: GetCredentialRequest = GetCredentialRequest.Builder()
            .addCredentialOption(googleIdOption)
            .build()

        Log.i("auth-google-credentialRequest", request.toString())


        val result = credentialManager.getCredential(
            request = request,
            context = context,
        )

        Log.i("auth-google-result", result.toString())





    }



    @Composable
    public fun DeveloperScreen1(navController : NavHostController, context : Context){

        var phoneNumber by rememberSaveable { mutableStateOf("") }
        var email by rememberSaveable { mutableStateOf("")}
        var otpCode by rememberSaveable { mutableStateOf("") }

        var useEmail by rememberSaveable { mutableStateOf(false)}

        var message by rememberSaveable { mutableStateOf("")}

        val coroutineScope = rememberCoroutineScope()

        Column {


            var user : User? = getCurrentUser()

            Text(
                textAlign = TextAlign.Center,
                fontSize = 5.em,
                text = "DEV SCREEN",
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(top = 10.dp)

            )

            Text(
                text = message,
                color = Color.Black
            )

            Button(
                onClick = {

                    coroutineScope.launch {

                        googleSignIn(context)

                    }
...




var screenHeight = 0.dp
var screenWidth = 0.dp

var authViewModel = AuthViewModel()



class MainActivity : ComponentActivity() {



    @RequiresApi(Q)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)


        Log.d("Initialize", "App Started")

        setContent {


            var context: Context = LocalContext.current

            Box(
                Modifier
                    .background(color = Color(0xFFBDC6CA))
                    .safeDrawingPadding()
            ) {
                MetroFCTheme {
                    MainContent(context)



                }
            }
        }

        actionBar?.hide()
        WindowCompat.setDecorFitsSystemWindows(window, false)
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) {
            window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN)
        } else {
            window.insetsController?.apply {
//                hide(WindowInsetsAndroid.Type.statusBars())
                systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            }
        }

    }


}



@RequiresApi(Q)
@Composable
fun MainContent(
    context : Context
){

    var user by remember{ mutableStateOf<User?>(null) }

    LaunchedEffect(key1 = user) {

        refreshMenu()

    }


    LaunchedEffect(key1 = "login") {

        user = loginAnonymously()
        Log.d("DB-User", "USER LOGIN SUCCESSFUL : $user")

    }


    Log.d("DB", "2." + user.toString())




    Log.d("Initialize","Database Connected")

    val configuration = LocalConfiguration.current
    screenHeight = configuration.screenHeightDp.dp
    screenWidth = configuration.screenWidthDp.dp

    var onDashboard by remember {mutableStateOf(true)}
    var onMenu = false
    val updateStates = { dashboard: Boolean, menu: Boolean ->
        onDashboard = dashboard
        onMenu = menu
    }

    val navController = rememberNavController()


    Scaffold(

        bottomBar = {
            if(authViewModel.isLoggedIn) NavigationBar(navController = navController, onDashboard, onMenu, updateStates)

                    },
        containerColor = MaterialTheme.colorScheme.background,
        contentWindowInsets = WindowInsets(0.dp),
        modifier = Modifier.fillMaxSize()

    ) {
    innerPadding ->

        val scrollState = rememberScrollState()

        val padding = innerPadding

        NavHost(
            navController = navController,
            startDestination = if (authViewModel.isLoggedIn) Route.DEV_SCREEN else Route.DEV_SCREEN,
            modifier = Modifier
//                .verticalScroll(state = scrollState)
                .fillMaxSize()
        ) {

            composable(route = Route.DEV_SCREEN){
                DeveloperScreen1(navController, context)
            }

            composable(route = Route.DASHBOARD_SCREEN) {

                authViewModel.login(user)
                DashboardScreen()
            }

            composable(route = Route.MENU_SCREEN) {
                authViewModel.login(user)
                MenuScreen(user)
            }
        }
    }
}

进程:com.metrofriedchicken.metrofc,PID:20630 androidx.credentials.exceptions.NoCredentialException:开始登录期间,一键失败响应:10:开发者控制台设置不正确。 在 androidx.credentials.playservices.controllers.CredentialProviderBaseController$Companion.getCredentialExceptionTypeToException$credentials_play_services_auth_release(CredentialProviderBaseController.kt:110) 在 androidx.credentials.playservices.controllers.BeginSignIn.CredentialProviderBeginSignInController$resultReceiver$1$onReceiveResult$1.invoke(CredentialProviderBeginSignInController.kt:93)

我已经尝试过:

  • 删除Keystore并创建一个新的(调试和发布)
  • 使用了Web应用程序客户端ID和Android客户端ID
  • 更换设备
  • 等了一天
android android-jetpack-compose google-signin credentials android-credential-manager
1个回答
0
投票

我假设您当前正在调试模式下集成凭证管理器,并在直接从 Android Studio 安装到测试设备的应用程序中测试您的集成。

在这种情况下,您需要配置当前用于签署应用程序的 SHA1 密钥,即 Android Studio 的调试密钥库。

在这种情况下,您可以通过在 Android Studio 的终端中运行以下命令来获取 SHA1:

./gradlew signingreport

从终端控制台复制正确的

Variant
Config
的正确 SHA1 指纹,并在云控制台中为应用程序的 Android OAuth2 客户端配置相同的指纹。

为了保持步骤清晰,我将其提及如下:

  1. 使用您应用程序的包名称在云 API 控制台中创建一个
    Android
    OAuth2 客户端。
  2. 如上所述,在 Android OAuth2 客户端创建中使用调试 SHA1 密钥(为了将其识别为调试客户端,您可以将带有 debug 的客户端名称附加为“your-app-debug”)
  3. 在云 API 控制台中创建一个
    Web OAuth2 client
    。这将充当您的应用程序的服务器
  4. 复制此 Web 客户端的 ClientID 并在集成中的
    setServerClientId(ServerClientID)
    中使用。

仅通过这些简单的步骤,您的集成就应该可以正常工作。

可选,下一步,

  1. 您可以使用发布密钥的 SHA1 指纹创建另一个
    Android OAuth2 client
    用于生产,并且为了识别该客户端,可以为其命名为“Your-app-release”
© www.soinside.com 2019 - 2024. All rights reserved.