2015-12-23 114 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