我目前正在尝试将Google登录功能集成到我的本地Flask Web应用程序中,并使用OAuthlib。在尝试运行Flask Google登录功能的已完成实现(如图here at RealPython)时,我遇到了以下错误:
oauthlib.oauth2.rfc6749.errors.InvalidClientError: (invalid_client) Unauthorized
它指向我的routes.py
文件中的这一行代码:
client.parse_request_body_response(json.dumps(token_response.json()))
我不知道为什么会出现这个错误,我该如何解决这个问题
以下是我的app/__init__.py
文件和routes.py
文件中的示例:
app/__init__.py
import os
from flask import Flask
from config import Development
from flask_caching import Cache
from flask_login import LoginManager
from flask_sqlalchemy import SQLAlchemy
from oauthlib.oauth2 import WebApplicationClient
app = Flask(__name__)
app.config.from_object(Development)
cache = Cache(app)
db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
client = WebApplicationClient(GOOGLE_CLIENT_ID)
from app import routes, forms, login, models
app/routes.py
import os
...
GOOGLE_CLIENT_ID = os.getenv("GOOGLE_CLIENT_ID")
GOOGLE_CLIENT_SECRET = os.getenv("GOOGLE_CLIENT_SECRET")
GOOGLE_DISCOVERY_URL = (
"https://accounts.google.com/.well-known/openid-configuration"
)
def get_google_provider_cfg():
return requests.get(GOOGLE_DISCOVERY_URL).json()
...
@app.route("/login-google")
def login_google():
google_provider_cfg = get_google_provider_cfg()
authorization_endpoint = google_provider_cfg["authorization_endpoint"]
request_uri = client.prepare_request_uri(
authorization_endpoint,
redirect_uri=flask.request.base_url + '/callback',
scope=["openid", "email", "profile"],
)
return flask.redirect(request_uri)
@app.route("/login-google/callback")
def callback():
code = flask.request.args.get("code")
google_provider_cfg = get_google_provider_cfg()
token_endpoint = google_provider_cfg["token_endpoint"]
token_url, headers, body = client.prepare_token_request(
token_endpoint, authorization_response=flask.request.url,
redirect_url=flask.request.base_url, code=code
)
token_response = requests.post(
token_url, headers=headers,
data=body, auth=(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET),
)
client.parse_request_body_response(json.dumps(token_response.json())) ## <--- Error Occurs Here!
userinfo_endpoint = google_provider_cfg["userinfo_endpoint"]
uri, headers, body = client.add_token(userinfo_endpoint)
userinfo_response = requests.get(uri, headers=headers, data=body)
flags = userinfo_response.json().get("email_verified")
...
你是说你想用谷歌登录你的网站? 我有自己的代码,它工作得很好 首先,init.py
第二,在main.py中,您可以更改为app.py,为便于将来编写代码,我认为您应该使用Blueprint
第三,在html中
对于我的代码,必须在models.py中创建模型
要使用模型,我使用Flask-Login
相关问题 更多 >
编程相关推荐