サービスをPython/Flaskで再作成していて、既存のクライアントの認証方法に問題があります。互換性の理由から、既存のクライアント方式と一致させる必要があります。コンテンツを強制するFlaskで既知のコンテンツタイプを入力または公開します
既存のクライアントはusername、passwordを使用し、base64はそれをエンコードします。 HTTPの基本認証ではありませんが、これは似たようなものです。以下は、このログイン要求を作成するサンプルコードです。
credentials = {
'username': '[email protected]',
'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)
サーバー側では、POSTデータを取得し、base64でデコードしてユーザー名とパスワード情報を再度取得します。
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')
問題はコンテンツタイプです。クライアント(application/gooblygop)に未知のContent-Typeを指定すると、FlaskはPOSTデータをrequest.dataに公開し、base64文字列をデコードできます。 Content-Typeをデフォルト(application/x-www-form-urlencoded)のままにしておくと、生データはrequest.dataに公開されず、base64でエンコードされた文字列を取得して使用する方法がわかりません。
既存のクライアントソフトウェアはすべてデフォルトでx-www-form-urlencodedになっていますが、これは常に当てはまるとは限りません。
本質的に、クライアントプログラムがどのようなContent-Typeに関係なく、コード化された文字列にアクセスするための信頼できるサーバー側のメソッドが必要です。
その他の注意事項:私はPHPのバックグラウンドから来た、Pythonの新機能です。だから私は非常に提案に開放されています。また、このプロジェクトは主に個人用です。