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

您需要将该 cookie 与您的 curl 请求一起发送,以便会话数据可用于处理,您可以使用 向 curl 请求添加其他标头-H,或显式指定 cookie:

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

浏览器当然会为你处理这个问题,但 curl 是完全无状态的,默认情况下不会为你解析和存储Set-Cookie标头,但如果你使用 curl 执行登录,你可以告诉它将 cookie 存储在一个 cookie jar 中-c <file>,然后您可以在下一个请求中读取它-b file

HTTP Cookie 维基页面

卷曲饼干文档

卷曲手册页

于 2013-03-29T10:54:22.000 回答