烧瓶不和谐 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 未经授权