2

ログインしたユーザーを追跡するためにセッションを使用するFlaskでRESTfulアプリケーションを構築しています。これは、このFlaskチュートリアルから適応したログインコードです

@mod.route('/login/', methods=['GET', 'POST'])
def login():
  user = User.query.filter_by(email=request.json['email']).first()
  # we use werkzeug to validate user's password
  if user and check_password_hash(user.password, request.json['password']):
    # the session can't be modified as it's signed, 
    # it's a safe place to store the user id
    session['user_id'] = user.id
    resp = jsonify({'status':'authenticated'})
  else:
    resp = jsonify({'status':'Invalid usernam/password'})
    resp.status_code = 401
  return resp

ユーザーが最初にログインすると、ユーザー ID をセッションに保存するので、同じユーザーがリソースを要求したときに、データがそのユーザーに合わせて調整されます。

@mod.route('/address/')
@requires_login
def user_data():
  user = User.query.filter_by(id=session['usr_id']).first
  resp = jsonify(user.address)
  return resp

ログイン後にこのコマンドを発行すると、次のようになります。

curl http://localhost:5000/address/

私は受け取ります:

{"status": 401, "message": "Unauthorized"}

ログインしたユーザーのアドレス情報の代わりに。後続のcurl呼び出しでセッションを使用して、Cookieに保存されているユーザーIDに固有のデータを返す方法を誰か教えてもらえますか?

4

1 に答える 1

6

ログイン要求への応答には、次のSet-Cookieようなヘッダーが含まれます。

Set-Cookie:session=<encoded session>; Path=/; HttpOnly

セッション データを処理できるように、curl リクエストでその Cookie を送信する必要があります-H

curl --cookie "session=<encoded session>" http://localhost:5000/address/

もちろん、ブラウザーはこれを処理しますが、curl は完全にステートレスでありSet-Cookie、デフォルトではヘッダーを解析して保存しません。ただし、curl を使用してログインを実行している場合は、-c <file>、そして次のリクエストでそれから読み取ることができます-b file

HTTP Cookie wiki ページ

カール Cookie ドキュメント

カールのマニュアルページ

于 2013-03-29T10:54:22.000 に答える