Instagram: Подпись не совпадает

Я пытаюсь начать работу с Instagram API, но не могу даже сделать простой вызов, потому что получаю сообщение об ошибке

{"code": 403, "error_type": "OAuthForbiddenException", "error_message": "Invalid signed-request: Signature does not match"}

Я сгенерировал свой access_token с областью действия likes+comments.

Это мой URL-адрес: https://api.instagram.com/v1/media/search?lat=48.858844&lng=2.294351&access_token=ACCESS-TOKEN&sig=SIG

Я сгенерировал подпись, используя этот скрипт с сайта разработчика Instagram, потому что изначально он дал мне

"Invalid signed-request: Missing required parameter 'sig'"

Это сценарий:

    # -*- coding: UTF-8 -*-
import hmac
from hashlib import sha256

def generate_sig(endpoint, params, secret):
    sig = endpoint
    for key in sorted(params.keys()):
        sig += '|%s=%s' % (key, params[key])
    return hmac.new(secret, sig, sha256).hexdigest()

endpoint = 'media/search'
params = {
    'access_token': _______________,
    'count': 10,
}
secret = ______________________
sig = generate_sig(endpoint, params, secret)
print "sig is",sig

Любая помощь приветствуется! Спасибо


person Arjun    schedule 23.12.2015    source источник


Ответы (1)


Из документов:

Когда этот параметр включен, Instagram будет проверять параметр sig каждого запроса и проверять, соответствует ли значение хешу, вычисленному с использованием вашего секрета клиента. Ожидаемое значение — это HMAC, использующий хеш-алгоритм SHA256 со всеми параметрами вашего запроса и вашим секретом клиента.

Ваша функция генератора подписи в порядке, но она не включает все параметры. Так должно быть:

params = {
    'access_token': _______________,
    'count': 10,
    'lat':  "<lat value>",
    'lng': "<long value>",
}

Это должно работать хорошо. Кроме того, вот несколько полезных дополнительных рекомендаций:
http://instagram-api.tumblr.com/post/120586735719/instagram-secure-api-requests

РЕДАКТИРОВАТЬ:

Вот точно так же, как я:

# coding: utf-8

# My client_id, secret, access_token, etc...
import settings
from urllib import urlencode
import hmac
from hashlib import sha256

def generate_sig(endpoint, params, secret):
    sig = endpoint
    for key in sorted(params.keys()):
        sig += '|%s=%s' % (key, params[key])
    return hmac.new(secret, sig, sha256).hexdigest()


endpoint = '/media/search'
params = {
    'access_token': settings.ACCESS_TOKEN,
    'lat': '48.858844',
    'lng': '2.294351',
    'count': 10,
}
params.update({'sig': generate_sig(endpoint, params, settings.CLIENT_SECRET)})
url = 'https://api.instagram.com/v1' + endpoint + '?' + urlencode(params)

# Success!!!
print url

Он должен дать нам URL в таком формате:

https://api.instagram.com/v1/media/search?access_token=XXX&lat=XXX&lng=XXX&sig=XXX&count=XXX
person felipsmartins    schedule 23.12.2015
comment
я думаю, что параметр 'count': 10 не должен передаваться при генерации подписи, поскольку его нет в URL-адресе. В соответствии с документом Insta — › Токен: конечная точка API, к которой добавлена ​​конкатенация всех пар ключ/значение параметров вашего запроса, отсортированных по ключу в порядке возрастания. Каждая пара ключ/значение отделяется вертикальной чертой. Таким образом, либо вы добавляете счетчик в URL-адрес вашего API-запроса, либо удаляете его из параметров генерации подписи, в противном случае он все равно будет выдавать ошибку «Недействительный подписанный запрос»! - person coderz; 24.12.2015
comment
@felipsmartins Спасибо за ответ. Я попробовал это, но это все еще не работает. Это дает мне ту же ошибку «Неверный подписанный запрос: подпись не соответствует». - person Arjun; 24.12.2015
comment
@coderz Я тоже это пробовал. Я удалил его из параметров и добавил свой URL как: api.instagram.com/v1/media/. Но это все еще дает мне ту же ошибку! - person Arjun; 24.12.2015
comment
@Arjun Вы включили подписанные запросы? Кроме того, можете ли вы предоставить полную информацию о сообщении об ошибке? - person felipsmartins; 24.12.2015
comment
@felipsmartins Сообщение об ошибке было следующим: {код: 403, тип_ошибки: OAuthForbiddenException, error_message: неверный подписанный запрос: подпись не совпадает} Кроме того, я снял флажок «Принудительно использовать подписанные запросы», и теперь я могу получить данные. - person Arjun; 24.12.2015
comment
@ Арджун хорошо, я попробую позже. Кстати, есть какая-то причина, по которой вы не используете официальную клиентскую библиотеку? Официальная клиентская библиотека автоматически поддерживает подписанные запросы. - person felipsmartins; 24.12.2015
comment
@felipsmartins Вы имеете в виду это? github.com/Instagram/python-instagram .. Я начал с него, но решил, что могу научитесь лучше работать с API, если буду делать это вручную :) - person Arjun; 24.12.2015
comment
@Arjun Это работает для меня. Посмотрите мой ответ еще раз, я отредактировал фрагмент рабочего кода. - person felipsmartins; 24.12.2015
comment
@felipsmartins Большое спасибо! Это работает хорошо .. не могли бы вы сказать мне, что я делаю неправильно? - person Arjun; 25.12.2015
comment
@Arjun Если вы получаете неверный подписанный запрос: подпись не соответствует, это означает, что значения, закодированные и отправленные в запрос, были неправильными. Просто сравните мой код фрагмента с вашим кодом. - person felipsmartins; 25.12.2015