我正在尝试创建一个“使用 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)
我已经尝试过:
我假设您当前正在调试模式下集成凭证管理器,并在直接从 Android Studio 安装到测试设备的应用程序中测试您的集成。
在这种情况下,您需要配置当前用于签署应用程序的 SHA1 密钥,即 Android Studio 的调试密钥库。
在这种情况下,您可以通过在 Android Studio 的终端中运行以下命令来获取 SHA1:
./gradlew signingreport
从终端控制台复制正确的
Variant
和 Config
的正确 SHA1 指纹,并在云控制台中为应用程序的 Android OAuth2 客户端配置相同的指纹。
为了保持步骤清晰,我将其提及如下:
Android
OAuth2 客户端。Web OAuth2 client
。这将充当您的应用程序的服务器setServerClientId(ServerClientID)
中使用。仅通过这些简单的步骤,您的集成就应该可以正常工作。
可选,下一步,
Android OAuth2 client
用于生产,并且为了识别该客户端,可以为其命名为“Your-app-release”