烧瓶不和谐 api 错误 “消息”:“401:未经授权”,“代码”:0

Posted

技术标签:

【中文标题】烧瓶不和谐 api 错误 “消息”:“401:未经授权”,“代码”:0【英文标题】:flask discord api error "message": "401: Unauthorized", "code": 0烧瓶不和谐 api 错误 “消息”:“401:未经授权”,“代码”:0 【发布时间】:2021-10-26 16:24:11 【问题描述】:

从flask以discord oauth2登录并接收登录用户信息的代码。 但是,只有在少数不和谐帐户下才能登录成功。 其余的账户都有这样的401错误。

我不知道为什么我只能从 Few 帐户正常登录,而不能从另一个帐户登录。

我的烧瓶代码:

from flask import Flask, request, render_template, redirect, session
from oauth import Oauth

app = Flask(__name__)

@app.route("/")
def index():
    return redirect(Oauth.discord_login_url)

@app.route("/login")
def login():
    code = request.args.get("code")
    access_token = Oauth.get_access_token(code)
    user_json = Oauth.get_user_json(access_token)
    username = user_json.get("username")
    
    return username

if(__name__ == "__main__"):
    app.run(host="0.0.0.0", port=8080)

oauth.py:

import requests


class Oauth(object):
    client_id = ...
    client_secret = ...
    scope = "email"
    redirect_uri = "http://192.168.35.5:8080/login"
    discord_login_url = f"https://discord.com/api/oauth2/authorize?client_id=client_id&redirect_uri=redirect_uri&response_type=code&scope=scope"
    discord_token_url = "https://discord.com/api/oauth2/token"
    discord_api_url = "http://discord.com/api"

    @staticmethod
    def get_access_token(code):
        payload = 
            "client_id": Oauth.client_id,
            "client_secret": Oauth.client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": Oauth.redirect_uri,
            "scope": Oauth.scope,
        
        headers = "Content-Type": "application/x-www-form-urlencoded"
        acces_token = requests.post(
            url=Oauth.discord_token_url, data=payload, headers=headers
        )
        print(acces_token)
        print(acces_token.text)
        json = acces_token.json()
        return json.get("access_token")
    @staticmethod
    def get_user_json(access_token):
        print(access_token)
        url = Oauth.discord_api_url + "/users/@me"
        data = 
            "scope": Oauth.scope
        
        headers = "Authorization": f"Bearer access_token"
        user_object = requests.get(url=url, data=data,  headers=headers)
        print(user_object)
        print(user_object.text)
        user_json = user_object.json()
        return user_json

打印:

<Response [200]>
"access_token": "rE2pOOJLn2rhpCxyEaKuYko0UDOG7N", "expires_in": 604800, "refresh_token": "HMSTtbeKXIbwSvrubBQfw9nkHu9cyu", "scope": "email", "token_type": "Bearer"
rE2pOOJLn2rhpCxyEaKuYko0UDOG7N
<Response [401]>
"message": "401: Unauthorized", "code": 0

在 ubuntu shell 中测试:

root@localhost:~# curl --location --request GET 'http://discord.com/api/users/@me' --header 'Authorization: Bearer RV41u
drW040OZGzzZO3rvI1hVyZO4n'

# this account is working

"id": "349781935196995585", "username": "Obtuse triangle", "avatar": "d57820246e2726d6b0f703ff216252d9", "discriminator": "5343", "public_flags": 64, "flags": 64, "banner": null, "banner_color": null, "accent_color": null, "locale": "en-US

root@localhost:~# curl --location --request GET 'http://discord.com/api/users/@me' --header 'Authorization: Bearer rE2pOOJLn2rhpCxyEaKuYko0UDOG7N'

# but this account is working

"message": "401: Unauthorized", "code": 0

【问题讨论】:

【参考方案1】:

来自 Discord 的文档:

返回请求者帐户的用户对象。对于 OAuth2,这需要 identify 范围,它将返回不带电子邮件的对象,以及可选的电子邮件范围,它返回带有电子邮件的对象。

尝试将identify 范围添加到您的令牌请求中

【讨论】:

我清除了几个变量的值来提出这个问题。 你在acces_token = ...也有错字 是的,我已经修改了这个。 Try adding the identify scope to your token request 这是这里?数据 = “范围”:[“识别”,“公会”] link 我认为是同样的问题。

以上是关于烧瓶不和谐 api 错误 “消息”:“401:未经授权”,“代码”:0的主要内容,如果未能解决你的问题,请参考以下文章

使用 Youtube Data API V3 和 Google API Client PHP 将视频上传到 Youtube - 获取 401(未经授权)消息

使用服务帐户通过 OAuth 2.0 调用 v3 Google 日历 API 时出现“需要登录”401 未经授权的消息

Cosmos db Rest API - 错误 401 未经授权

LinkedIn 邀请 API 错误 401 [未经授权]-iPhone sdk

HTTP错误401.0 - 未经授权的错误消息

401 未经授权的错误 web api mvc windows 身份验证