I need to write a client for Google Drive. I tried to do authentication and authorization, but when I try to send a request to Google Drive to get all the files from the drive, I get the error 401 unauthorized.
Here I authenticate through the credential manager and receive a token.
class LogginViewModel: ViewModel() {
private val _loginResult = MutableLiveData<Boolean>()
val loginResult: LiveData<Boolean> get() = _loginResult
private val _loginData = MutableLiveData<String>()
val loginData: LiveData<String> get() = _loginData
fun signInGoogle(context: Context) {
val credentialManager = CredentialManager.create(context)
val getGoogleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
.setFilterByAuthorizedAccounts(false)
.setServerClientId("77699025246-l0t92qgqq3bc8d699vj3o5cixxxxxxx.apps.googleusercontent.com")
.setNonce(generateNonce())
.build()
val request: GetCredentialRequest = GetCredentialRequest.Builder()
.addCredentialOption(getGoogleIdOption)
.build()
viewModelScope.launch(Dispatchers.Main) {
try {
val result = credentialManager.getCredential(
request = request,
context = context,
)
val credential = result.credential
val googleIdTokenCredential = GoogleIdTokenCredential
.createFrom(credential.data)
val googleIdToken = googleIdTokenCredential.idToken
_loginData.value = googleIdToken
_loginResult.value = true
} catch (e: androidx.credentials.exceptions.GetCredentialException) {
_loginData.value = "1" + e.message
_loginResult.value = false
} catch (e: GoogleIdTokenParsingException) {
_loginData.value = "2" + e.message
_loginResult.value = false
}
}
}
private fun generateNonce(): String {
val rawNonce = UUID.randomUUID().toString()
val bytes = rawNonce.toByteArray()
val md = MessageDigest.getInstance("SHA-256")
val digest = md.digest(bytes)
return digest.fold("") {str, it -> str + "%02x".format(it) }
}
}
Here I send a request to which I pass the user token. But in response I get a 401 error. What am I doing wrong?
class MenuViewModel: ViewModel() {
private val _driveFiles = MutableLiveData<List<com.google.api.services.drive.model.File>>()
val driveFiles: LiveData<List<com.google.api.services.drive.model.File>> get() = _driveFiles
fun fetchDriveFiles(googleIdToken: String) {
viewModelScope.launch(Dispatchers.IO) {
try {
val HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport()
val JSON_FACTORY = GsonFactory.getDefaultInstance()
val credential = GoogleCredential().setAccessToken(googleIdToken)
val driveService = Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
.setApplicationName("Drive API Kotlin Example")
.build()
val result: FileList = driveService.files().list()
.setPageSize(10)
.setFields("nextPageToken, files(id, name)")
.execute()
val files = result.files
if (files != null && files.isNotEmpty()) {
_driveFiles.postValue(files)
} else {
_driveFiles.postValue(emptyList())
}
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
enter image description here