【问题标题】:How to post json data properly to Instagram OAuth2 protocol?如何将 json 数据正确发布到 Instagram OAuth2 协议?
【发布时间】:2021-08-17 03:58:46
【问题描述】:

我正在开发一个使用 Instagram 的 OAuth 身份验证服务 (based on this description) 的 Flask 网站。我能够访问 Instagram 并获得了身份验证所需的代码,但在最后一步我收到一条错误消息,指出我认为我没有提供“client_id”。

from flask import Flask, request, redirect
import requests
import json

client_id = ""
client_secret = ""
redirect_uri = ""
authorization_url = "https://api.instagram.com/oauth/authorize"

app = Flask(__name__)
app.debug = True
app.secret_key = 'development'

@app.route('/')
def index():
    return redirect(authorization_url + "/?client_id=" + client_id + "&redirect_uri=" + redirect_uri + "&scope=public_content&response_type=code")

@app.route('/callback')
def callback():
    code = request.args.get('code')

    payload = {"client_id": client_id,
    "client_secret": client_secret,
    "grant_type": "authorization_code",
    "redirect_uri": redirect_uri,
    "code": code}

    r = requests.post('https://api.instagram.com/oauth/access_token', data=json.dumps(payload))
    return r.text

返回错误:

{"error_type": "OAuthException", "code": 400, "error_message": "You must provide a client_id"}

我觉得这很奇怪,因为我确实在有效负载中提供了 client_id。 可能是什么问题?

【问题讨论】:

    标签: python json flask oauth


    【解决方案1】:

    看来,payload 不一定是 json,而是一个简单的字典。 使用以下形式:

    r = requests.post('https://api.instagram.com/oauth/access_token', data=payload)
    

    【讨论】:

      【解决方案2】:

      根据 RFC 7662,您需要使用 Content-Type: x-www-form-urlencoding 发送您的请求(因此,您有一组 key=value 由 & 分隔,而不是 JSON 对象,并将 encodeURIComponent 应用于每个键和值)。您的请求中还需要 Content-Type: x-www-form-urlencoding 标头。你会得到 JSON。

      如下所示: 从 urllib.parse 导入 urlencode,quote_plus

      // 从上面使用你的对象 结果 = urlencode(payload, quote_via=quote_plus)

      然后将结果文本用作 POST 的有效负载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 2017-10-05
        • 2012-06-21
        相关资源
        最近更新 更多