Я отлаживаю эту проблему с начала месяца.
Я хочу использовать аутентификацию OVH API. Восстановление consumerKey и отметки времени в порядке, но создание подписи не работает. Я создал функцию синтаксического анализа для его генерации, следуя документации , но ovh не принимает подпись:
class RestApiRepository {
private val _consumerValidationLivedata = MutableLiveData<ConsumerValidation>()
private val _containerContentLivedata = MutableLiveData<String>()
private var ck: String = ""
fun receiveConsumerValidation(credentials: Credentials): LiveData<ConsumerValidation> {
GlobalScope.launch(Dispatchers.IO) {
val consumerValidation = OvhService.Request().getConsumerValidation(credentials)
_consumerValidationLivedata.postValue(consumerValidation)
consumerValidation?.run {
log("Consumer validation: $this")
ck = consumerKey
ping(validationUrl)
}
}
return _consumerValidationLivedata
}
fun receiveContainerContent(): LiveData<String> {
GlobalScope.launch(Dispatchers.IO) {
val signature = getHash("GET","${OVH_URL}cloud/project/", "$SERVICE_NAME/storage/$CONTAINER_MESSENGER/")
val headers = mapOf(
Pair(XOvh.APPLICATION.type, APP_KEY),
Pair(XOvh.TIMESTAMP.type, signature.timestamp),
Pair(XOvh.SIGNATURE.type, signature.sha1),
Pair(XOvh.CONSUMER.type, ck))
val containerContent = OvhService.Request().getContainerContent(headers)
_containerContentLivedata.postValue(containerContent)
}
return _containerContentLivedata
}
private fun getHash(method: String, url: String, path: String): Signature {
val timestamp = ping(OVH_TIMESTAMP_URL)
val secret = "$APP_SECRET+$ck+$method+$url+$path+$timestamp"
val sha1 = "$1$${SHA1.sha1Hash(secret).toLowerCase(Locale.ROOT)}"
log("SECRET = $secret")
log("SHA1 = $sha1")
return Signature(timestamp, sha1)
}
}
2020-08-03 19:54:45.425 24310-24421/com.elfefe.coffeejoin I/Request: Headers:
X-Ovh-Application: "Application key is here"
X-Ovh-Timestamp: 1596477287
X-Ovh-Signature: "Signature is here"
X-Ovh-Consumer: "Consumer key is here"
Body: https://eu.api.ovh.com/1.0/cloud/project/"Project id is here"/storage/"Storage service id is here"
2020-08-03 19:54:45.863 24310-24421/com.elfefe.coffeejoin I/Request: Message:
Response{protocol=http/1.1, code=400, message=Bad Request, url=https://eu.api.ovh.com/1.0/cloud/project/"Project id is here"/storage/"Storage service id is here"}
body: {"message":"Invalid signature","httpCode":"400 Bad Request","errorCode":"INVALID_SIGNATURE"}
2020-08-03 19:54:45.864 24310-24310/com.elfefe.coffeejoin I/MapsFragment: Container content: null <- "The body of the response"
Как вы можете видеть, ovh обнаруживает недопустимую подпись (Я сравнил свой генератор sha1 с онлайн-генератором sha1, и они генерируют тот же ключ).
Я знаю, что это проблема, которая может помочь многим людям, спасибо за вашу помощь.