Flask-OAuth对接Facebook时出现Unicode编码TypeError求助
解决Flask-OAuth对接Facebook时的Unicode编码哈希错误
嘿,这个问题我之前踩过坑!你碰到的TypeError: Unicode-objects must be encoded before hashing本质上是旧版Flask-OAuth不兼容Python 3导致的。
错误原因
原来的Flask-OAuth(版本0.12及更早)是针对Python 2开发的,而Python 3里字符串默认是Unicode类型。OAuth请求签名的过程需要对字节串进行哈希运算,但旧库直接把Unicode字符串丢给了哈希函数,自然就触发了类型错误——刚好在调用facebook.get('/me')这一步暴露出来,因为这时候要生成带签名的请求去调用Facebook Graph API。
解决方案
1. 切换到维护中的兼容库(强烈推荐)
旧版Flask-OAuth早就停止维护了,建议直接换成Flask-OAuthlib,它是Flask-OAuth的替代项目,完美适配Python 3。
首先安装库:
pip install flask-oauthlib
然后调整你的代码(大部分逻辑可以复用,只是导入和初始化略有变化):
from flask import Flask from flask_oauthlib.client import OAuth app = Flask(__name__) # 配置你的Facebook应用信息 app.config['FACEBOOK_APP_ID'] = '你的APP_ID' app.config['FACEBOOK_APP_SECRET'] = '你的APP_SECRET' oauth = OAuth(app) facebook = oauth.remote_app( 'facebook', consumer_key=app.config['FACEBOOK_APP_ID'], consumer_secret=app.config['FACEBOOK_APP_SECRET'], request_token_params={'scope': 'email'}, # 按需添加权限 base_url='https://graph.facebook.com/', request_token_url=None, access_token_url='/oauth/access_token', authorize_url='https://www.facebook.com/dialog/oauth' )
之后再调用facebook.get('/me')就不会再出现编码问题了。
2. 临时修改旧库源码(不推荐,应急用)
如果暂时不想换库,可以手动修改Flask-OAuth的源码来修复编码问题:
- 找到你Python环境中Flask-OAuth的安装目录(比如
site-packages/flask_oauth) - 打开
oauth.py文件,找到处理签名的函数(比如_sign方法里的哈希操作部分) - 把所有传入哈希函数的字符串都加上
.encode('utf-8'),比如把hash.update(key)改成hash.update(key.encode('utf-8'))
不过这种方法只是临时补丁,后续更新库后会失效,还是推荐用第一种方案更稳妥。
内容的提问来源于stack exchange,提问作者Tri
相关产品推荐
相关产品推荐

