Проблема с использованием API OVH в облачном хранилище publi c? - PullRequest
0 голосов
/ 03 августа 2020

Я отлаживаю эту проблему с начала месяца.

Я хочу использовать аутентификацию 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, и они генерируют тот же ключ).

Я знаю, что это проблема, которая может помочь многим людям, спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...