【问题标题】:use curl with cookies将 curl 与 cookie 一起使用
【发布时间】:2016-02-14 07:31:15
【问题描述】:

我正在尝试使用 curl 对我的 Web 服务器进行身份验证,以便使用 curl 执行一些安全请求。

要进行身份验证,我使用以下命令:

curl -c cookie.txt -H 'Content-Type: application/json' --data -d "{\"admin_user\" : { \"email\" : \"example@example.com\", \"password\" : \"very_secured\"}}" -X POST http://localhost:3000/admin/login 

身份验证运行良好。我看到服务器创建了一个新的会话 ID。

UPDATE "admin_users" SET "last_sign_in_at" = '2015-11-12 19:41:32.927958', "current_sign_in_at" = '2015-11-12 20:04:32.798444', "sign_in_count" = 317, "updated_at" = '2015-11-12 20:04:32.861759' WHERE "admin_users"."id" = 13

然后我尝试重用从响应中收到的 cookie,以从我的服务器检索一些数据:

curl -b cookie.txt  'http://127.0.0.1:3000/admin/my_secured_page'

尽管如此,我还是被重定向回登录页面,并出现错误 401: 4.6ms内完成401 Unauthorized

我试图将我正在做的事情与 Firefox 和 Chrome 做的事情进行比较,但我没有发现身份验证过程有任何区别。

当我使用 Chrome 或 Firefox 检索的 cookie 时,它​​可以工作,但 curl 生成的却不能。

我什至尝试编辑 curl 生成的 cookie 以将会话 id 编辑为从 chrome cookie 复制的会话标识符,这也有效。

当我在请求标头上比较登录页面返回的 cookie 和我发送到安全页面的 cookie 时,它​​们具有相同的值。

有人知道我做错了什么吗?

【问题讨论】:

    标签: authentication curl cookies


    【解决方案1】:

    我自己发现了这个问题,身份验证页面包含一个真实性令牌,应该传递给身份验证请求。

    为了解决这个问题,python requests 让我的生活变得简单:

    import requests
    import re
    from urlparse import urljoin
    
    session = requests.session    
    url = urljoin(server_url, 'admin/login')
    r = session.get( url)
    matchme = 'meta content="(.*)" name="csrf-token" '
    csrf = re.search( matchme,str(r.text))
    
    session.post( url, data={ 
            "admin_user[email]" : admin_email,
            "admin_user[password]" : admin_password,
            "authenticity_token" :  csrf.group(1),
            "commit" : "Login"
    })
    

    这已经完成了,我们现在已经通过了身份验证,我们可以使用此会话作为经过身份验证的用户进行浏览:

    res = session.get(secured_url)
    

    【讨论】:

      猜你喜欢
      • 2011-04-01
      • 1970-01-01
      • 2015-08-26
      • 2016-06-26
      • 1970-01-01
      • 2011-09-03
      • 2018-02-01
      • 2014-03-06
      • 1970-01-01
      相关资源
      最近更新 更多