2015-12-23 111 views
0

我想开始使用Instagram的API,但我甚至不能做一个简单的通话,因为我得到一个错误的Instagram:签名不匹配

{"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 

任何帮助表示赞赏! 感谢

回答

3

从文档:

启用后,Instagram的会检查每个 请求SIG参数,并验证值相匹配使用 端密钥的哈希计算。预期值是HMAC使用SHA256散列 算法与所有请求参数和您的客户端密钥。

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

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

它应该很好。 另外,这里是一些有用的aditional的准则:
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 
+0

我认为''count':10'参数不应该在签名生成中传递,因为它不存在于url中。根据Insta文档 - >令牌:API端点附有您的请求参数的所有键/值对的串联,按键升序排序。每个键/值对由管道字符分隔。 因此,无论您是将计数添加到您的API请求网址还是将其从签名生成参数中移除,否则它仍会提供“无效的签名请求”错误! – coderz

+0

@felipsmartins感谢您的回答。我尝试过,但仍然无法正常工作。它给了我相同的“签名请求无效:签名不匹配”错误。 – Arjun

+0

@coderz我也试过。我将它从参数中删除,并将其网址添加为:https://api.instagram.com/v1/media/search?lat=48.858844&lng=2.294351&access_token=ACCESS-TOKEN&sig=SIG&count=10。但是,它仍然给我同样的错误! – Arjun