【问题标题】:Instagram: Signature did not matchInstagram:签名不匹配
【发布时间】:2015-12-23 19:32:06
【问题描述】:

我正在尝试开始使用 Instagram API,但我什至无法进行简单的调用,因为我收到了一个错误

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

我生成了access_token,范围为likes+comments

这是我的网址: 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

感谢任何帮助! 谢谢

【问题讨论】:

    标签: python instagram instagram-api


    【解决方案1】:

    来自文档:

    启用后,Instagram 将检查每个参数的 sig 参数 请求并验证该值是否与使用您计算的哈希值匹配 客户机密。预期值是使用 SHA256 哈希的 HMAC 您的所有请求参数和您的客户端密码的算法。

    您的签名生成器功能没问题,但它不包括所有参数。应该是:

    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
    

    【讨论】:

    • 我认为 'count': 10 参数不应在签名生成中传递,因为它不存在于 url 中。根据 Insta doc -> Token: API 端点附加了请求参数的所有键/值对的串联,按键按升序排序。每个键/值对由管道字符分隔。因此,要么将计数添加到 API 请求 URL 中,要么将其从签名生成参数中删除,否则仍然会给出“无效签名请求”错误!
    • @felipsmartins 感谢您的回答。我试过了,但还是不行。它给了我同样的“无效签名请求:签名不匹配”错误。
    • @coderz 我也试过了。我将其从参数中删除,并将其添加为我的 URL:api.instagram.com/v1/media/…。但是,它仍然给我同样的错误!
    • @Arjun 您是否启用了“签名请求”?另外,能否提供完整的错误信息信息?
    • @felipsmartins 错误消息是:{"code": 403, "error_type": "OAuthForbiddenException", "error_message": "Invalid signed-request: Signature does not match"} 另外,我没有勾选“强制执行签名请求”,现在我可以获取数据了。