Flask使用Oauthlib实现Facebook登录的重定向问题求助
解决Flask中Facebook登录重定向URI不匹配问题
问题根源
你生成的授权请求中,redirect_uri出现了连续双斜杠:https://127.0.0.1:5000/user/facebook//auth,但Facebook开发者后台配置的是https://127.0.0.1:5000/user/facebook/auth,路径不一致导致验证失败。
解决步骤
1. 修正回调URL生成方式
不要手动拼接URL,改用Flask的url_for函数生成绝对URL,自动处理斜杠问题:
修改facebook视图函数:
from flask import url_for # 确保导入url_for @users_view.route('/facebook/') def facebook(): credentials = current_app.config['OAUTH_CREDENTIALS']['facebook'] f_client = WebApplicationClient(credentials['id']) authorization_endpoint = 'https://www.facebook.com/dialog/oauth' # 用url_for生成标准的回调绝对URL redirect_uri = url_for('users_view.facebook_callback', _external=True) request_uri = f_client.prepare_request_uri( authorization_endpoint, redirect_uri=redirect_uri, scope=["email"], auth_type = "reauthenticate", ) print("REQUEST: {}".format(request_uri)) return redirect(request_uri)
同时,在facebook_callback函数中保持redirect_url一致:
@users_view.route("/facebook/auth") def facebook_callback(): credentials = current_app.config['OAUTH_CREDENTIALS']['facebook'] f_client = WebApplicationClient(credentials['id']) token_endpoint = 'https://graph.facebook.com/oauth/access_token' code = request.args.get("code") # 同样用url_for生成匹配的redirect_url redirect_url = url_for('users_view.facebook_callback', _external=True) token_url, headers, body = f_client.prepare_token_request( token_endpoint, authorization_response=request.url, redirect_url=redirect_url, code=code ) print("ALL: url:{} headers:{} body:{} ".format(token_url, headers, body)) # 后续登录逻辑处理...
2. 验证URI一致性
确保Facebook开发者后台配置的重定向URI,和url_for生成的URL完全匹配:
- 协议一致:本地测试用https的话,后台也要配置对应https的URI
- 域名、端口一致:必须和Flask服务运行地址完全相同(比如
127.0.0.1:5000) - 路径无冗余:确保没有多余斜杠或缺失的路径段
补充说明
手动拼接URL时,request.base_url会包含当前路由末尾的斜杠(你的路由是/facebook/),拼接/auth后就会出现//auth的错误路径。url_for会自动遵循Flask的路由规则生成标准URL,从根源避免这类问题。
内容的提问来源于stack exchange,提问作者ussrback
相关产品推荐
相关产品推荐

