我正在使用Python/Flask重新创建服务,并且遇到了现有客户端进行身份验证的问题.出于兼容性原因,我必须匹配现有的客户端方案.
现有客户端使用用户名,密码和base64对其进行编码.这不是HTTP基本身份验证,尽管听起来很相似.下面是一些创建此登录请求的示例代码.
credentials = {
'username': 'test@example.com',
'password': 'password'
}
data = b64encode(urlencode(credentials))
request = urllib2.Request(loginURL)
request.add_data(data)
# request.add_header('Content-Type', 'application/gooblygop')
# 'application/x-www-form-urlencoded' seems to be a default Content-Type
login = urllib2.urlopen(request)
Run Code Online (Sandbox Code Playgroud)
在服务器端,我接受POST数据并对其进行解码,以便再次获取用户名和密码信息.
flask server:
@app.route('/login', methods=['POST'])
def login():
error = None
if request.method == 'POST':
# post data: cGFzc3dvcmQ9ZGVmYXVsdCZlbWFpbD10ZXN0JTQwZXhhbXBsZS5jb20=
data = b64decode(request.data)
# decoded data: password=default&email=test%40example.com
return('ok')
Run Code Online (Sandbox Code Playgroud)
问题是内容类型.如果我在客户端(application/gooblygop)中指定了未知的Content-Type,Flask会将POST数据暴露给request.data,我可以解码base64字符串.如果我离开的Content-Type为默认值(应用程序/ x-WWW的形式,进行了urlencoded),原始数据不会暴露request.data,我不知道如何获取base64编码字符串,并利用它.
现有的客户端软件几乎默认为x-www-form-urlencoded,但我不能完全依赖于这种情况.
本质上,无论客户端程序指出什么Content-Type,我都需要一个可靠的服务器端方法来访问该编码字符串.
其他说明:我是Python的新手,来自PHP背景.所以我对建议很开放.此外,该项目主要供个人使用.