2014-09-28 2 views
0

Кажется, что я не могу найти это в любом месте на SO или даже в Google - у меня есть подписанный oauth вызов Flickr upload API, и после the docs Я подписал операцию POST обычным способом oauth (но без данных photo). Для тестирования я прошел только по title и данных photo, что означает, что я в конечном итоге в вар flickrURI, содержащий следующий URL-адрес для отправки сообщений:API Flickr выдает «Недопустимый ключ API (ключ имеет недопустимый формат)» при отправке данных POST с подпиской oauth

https://api.flickr.com/services/upload/ 
? format=json 
& oauth_consumer_key=... 
& oauth_nonce=2e57b73fec6630a30588e22383cc3b25 
& oauth_signature_method=HMAC-SHA1 
& oauth_timestamp=1411933792346 
& oauth_token=... 
& title=test 
& oauth_signature=O7JPn1m06vl5Rl95Z2in32YWp7Q%3D 

(разбит на несколько строк для удобочитаемости в этом вопросе , фактический URL-адрес не имеет пробелов вокруг ? и & по понятным причинам).

Самостоятельное самоописание совершенно верно и код, используемый для доступа к API-интерфейсу без загрузки по всему сайту с правильным поведением, поэтому для него невозможно сделать неправильное подписание, отличное от подписания с «недостаточно данных» или, возможно, подписание с «слишком большим количеством данных».

Подписание аутентификации первым формирует строку аутентификации запроса, в данном случае:

oauth_consumer_key=... 
&oauth_nonce=60028905f65cf9d7649b3bce98f718f8 
&oauth_signature_method=HMAC-SHA1 
&oauth_timestamp=1411939726691 
&oauth_token=... 
&title=test 

, который затем используется для формирования глагола + адреса + закодированной базовую строки:

POST&https%3A%2F%2Fapi.flickr.com%2Fservices%2Fupload%2F&oauth_consumer_key%3D...%26oauth_nonce%3D60028905f65cf9d7649b3bce98f718f8%26oauth_signature_method%3DHMAC -SHA1%26oauth_timestamp%3D1411939726691%26oauth_token%3D...%26title%3Dtest

В этом затем HMAC-SHA1 переваривается с использованием секретов Flickr и oauth:

function sign = (data, key, secret) { 
    var hmacKey = key + "&" + (secret ? secret : ''), 
     hmac = crypto.createHmac("SHA1", hmacKey); 
    hmac.update(data); 
    var digest = hmac.digest("base64"); 
    return encodeURIComponent(digest); 
} 

И для запросов GET это работает отлично. Для POST запросов вещи кажутся разница, несмотря на документы не объясняют, какая часть предположительно отличается, поэтому я испытанный использовать пакет Nodejs request выполнить действие POST в том, что казалось обычным способом, с помощью:

uploadOptions = { 
    oauth_consumer_key = auth.api_key, 
    oauth_nonce = auth.oauth_nonce, 
    oauth_timestamp = auth.oauth_timestamp, 
    oauth_token = auth.access_token, 
    oauth_signature_method = "HMAC-SHA1", 
    title: title, 
    photo: <binary data buffer> 
}; 

flickrURL = formSignedURL(auth); 

request.post({ 
    url: flickrURI, 
    headers: { 
    "Authorization": 'oauth_consumer_key="...",oauth_token="...",oauth_signature_method="HMAC-SHA1",oauth_signature="...",oauth_timestamp="...",oauth_nonce="...",oauth_version="1.0"' 
    }, 
    multipart: [{ 
    'content-type': 'application/json', 
    body: JSON.stringify(signOptions) 
    }] 
},function(error, response, body) { 
    console.log("error"); 
    console.log(error); 
    console.log("body"); 
    console.log(body); 
    } 
); 

, который дает тело, которое содержит:

<?xml version="1.0" encoding="utf-8" ?> 
<rsp stat="fail"> 
    <err code="100" msg="Invalid API Key (Key has invalid format)" /> 
</rsp> 

Как подписания OAuth действительно не дает мне выбор, в котором ключ API, чтобы обеспечить (есть только один) и подписание работает просто отлично для не-загрузки API, я не могу понять, что это сообщение об ошибке пытается сказать мне. Ключ, безусловно, правильный формат, потому что это формат Flickr дает вам, и это правильное значение, потому что оно отлично работает за пределами загрузки. Я также удостоверился, что ящик oauth и секрет для этого ключа с разрешением «удалить» (максимально возможные разрешения), поэтому включенный токен доступа и ключ доступа к токенам должны передать «этот токен для этого ключа имеют разрешения на запись».

Какие очевидные вещи я пропускаю здесь, чтобы предотвратить загрузку?

ответ

0

Получается, что данные в виде request.post недостаточно хороши и сделают Flickr API «неверным кодом ошибки», вместо того, чтобы говорить, что на самом деле неправильно. Следующий request вызов, с точно такими же данными, работает:

var uploadOptions = ... 

var flickrURL = ...; 

var req = request.post(flickrURL, function(error, response, body) { 
    callback(error, body); 
}); 

var form = req.form(); 
uploadOptions.photo = fs.createReadStream(...); 
Object.keys(photoOptions).forEach(function(prop) { 
    form.append(prop, photoOptions[prop]); 
}); 

Несмотря на не делает все, что много смысла вызова мудр (почему бы не POST уже сделано к тому времени, которое мы называем form = req.form()?) Это запрос в " правильный "способ отправить полезную нагрузку POST по проводу и делает процесс Flickr API для загрузки фотографий просто прекрасным.

0

Похоже, вы используете конечную точку https://up.flickr.com/services/upload/, в которой используется старая схема аутентификации.

Для OAuth это должно быть https://api.flickr.com/services/upload/. Убедитесь, что конечная точка включена в процесс подписания.

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

+0

наверняка, что, по крайней мере, будет https? В стороне, с обновленным URL-адресом, я все еще получаю неверный ключ API. Я обновил вопрос, хотя (и да, URl используется при подписании, поскольку конкатенация VERB + url + queryarg) –

+0

да, это должно быть https. Я только что отредактировал его. – ikumen

Смежные вопросы