在Flask中,如何使用安全会话通过curl对用户进行身份验证?

时间:2013-03-28 22:43:30

标签: python rest curl flask

我正在使用Flask构建一个RESTful应用程序,它将使用会话来跟踪登录用户。这是我从此Flask tutorial

改编的登录代码
@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的数据?

1 个答案:

答案 0 :(得分:6)

对您的登录请求的响应将包含Set-Cookie标题,如下所示:

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

您需要使用curl请求发送该cookie,以便会话数据可供处理,您可以使用-H添加额外的标头以卷曲请求,或明确指定Cookie:

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

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

的下一个请求中读取该Cookie

HTTP Cookie wiki page

Curl cookie docs

Curl man page