Twitter OAuth 身份验证出现 401 错误

时间:2021-07-01 05:21:58

标签: python twitter oauth twitter-oauth

import requests
import secrets
import time
import hmac
import base64
from hashlib import sha1
from urllib.parse import quote_plus
from src.config import API_KEY, ACCESS_TOKEN, API_KEY_SECRET, ACCESS_TOKEN_SECRET


def get_oauth_params():
    oauth_nonce = secrets.token_hex(16)
    oauth_consumer_key = API_KEY
    oauth_signature_method = "HMAC-SHA1"
    oauth_timestamp = str(int(time.time()))
    oauth_version = "1.0"
    oauth_token = ACCESS_TOKEN
    oauth_params = {
                    "oauth_nonce": oauth_nonce,
                    "oauth_consumer_key": oauth_consumer_key,
                    "oauth_signature_method": oauth_signature_method,
                    "oauth_timestamp": oauth_timestamp,
                    "oauth_version": oauth_version,
                    "oauth_token": oauth_token
                    }
    return oauth_params


def get_signature(signature_base_string, signing_key):
    signature_base_string_bytes = bytes(signature_base_string,'ascii')
    signing_key_bytes = bytes(signing_key,'ascii')
    hashed = hmac.new(signing_key_bytes, signature_base_string_bytes, sha1)
    hashed_bytes = hashed.digest()
    b64_bytes = base64.b64encode(hashed_bytes)
    b64_signature = quote_plus(b64_bytes.decode('ascii')).rstrip("\n");
    return b64_signature


def make_auth_request(url, callback_url):
    oauth_params = get_oauth_params()
    parameter_string = f"oauth_callback={callback_url}&oauth_consumer_key={oauth_params['oauth_consumer_key']}&oauth_nonce={oauth_params['oauth_nonce']}&oauth_signature_method={oauth_params['oauth_signature_method']}&oauth_timestamp={oauth_params['oauth_timestamp']}&oauth_token={oauth_params['oauth_token']}&oauth_version={oauth_params['oauth_version']}"
    percent_encoded_parameter_string = quote_plus(parameter_string)
    percent_encoded_url = quote_plus(url)
    signature_base_string = f"POST&{percent_encoded_url}&{percent_encoded_parameter_string}"
    signing_key = quote_plus(API_KEY_SECRET) + "&" + quote_plus(ACCESS_TOKEN_SECRET)
    oauth_signature = get_signature(signature_base_string, signing_key)
    percent_encoded_callback_url = quote_plus(callback_url)
    headers = {
                "Accept": "*/*",
                "Connection": "close",
                "Content-Type": "application/x-www-form-urlencoded",
                "Authorization": f"OAuth oauth_callback=\"{percent_encoded_callback_url}\",oauth_consumer_key=\"{oauth_params['oauth_consumer_key']}\",oauth_nonce=\"{oauth_params['oauth_nonce']}\",oauth_signature=\"{oauth_signature}\",oauth_signature_method=\"{oauth_params['oauth_signature_method']}\",oauth_timestamp=\"{oauth_params['oauth_timestamp']}\",oauth_token=\"{oauth_params['oauth_token']}\",oauth_version=\"{oauth_params['oauth_version']}\"",
            }
    print(headers["Authorization"])
    r = requests.post(url, headers=headers)
    print(r.status_code)
    r_json = r.json()
    return r_json


if __name__ == '__main__':
    r_json = make_auth_request("https://api.twitter.com/oauth/request_token", "https://crunchftw.github.io")
    print(r_json)

我想用 twitter 实现登录,为此我首先必须通过带有 oauth 签名的 https://api.twitter.com/oauth/request_token POST 请求获取 oauth 令牌。我想我已经正确地实施了一切。 paramenter 字符串和 oauth 授权字符串按顺序排列。但是 Twitter 发回了一个错误

401 {'errors': [{'code': 32, 'message': 'Could not authenticate you.'}]}

有人可以帮忙吗?

我使用此 Twitter 网站创建签名 https://developer.twitter.com/en/docs/authentication/oauth-1-0a/creating-a-signature

0 个答案:

没有答案