使用发布请求获取身份验证令牌

Posted

技术标签:

【中文标题】使用发布请求获取身份验证令牌【英文标题】:Get auth token using post request 【发布时间】:2018-11-12 04:44:20 【问题描述】:

我正在尝试通过向 url 发出 post web 请求来获取请求身份验证令牌。 api 需要用户名/密码作为 form-data 有效负载中的凭据。

当我点击浏览器上的登录选项时,网络日志显示GET 请求以html 作为响应,然后是POST 请求,该请求返回带有用户名/密码和请求令牌的表单数据在有效载荷中。

尝试使用webrequest 模拟流程,我正在做一个简单的post 请求,如下所示:

public string HttpPost(string url, string post, string refer = "")
        
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            // request.CookieContainer = cJar;
            request.UserAgent = UserAgent;
            request.KeepAlive = false;
            request.Method = "POST";
            request.Referer = refer;

            byte[] postBytes = Encoding.ASCII.GetBytes(post);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = postBytes.Length;

            Stream requestStream = request.GetRequestStream();
            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());

            return sr.ReadToEnd();
        

但是,这个请求只返回页面的文本/HTML 标记,就像浏览器请求的第一部分一样。如何让它运行后续的POST 以从端点获取令牌?

编辑 1:

这是第一个GET请求:

【问题讨论】:

使用fiddler,你能把相关请求的日志贴在这里吗?请求和响应。如果它返回 html 而不是 json 或 xml,则初始 get 请求似乎无关紧要 似乎在 mac os 上运行 fiddler 是一个痛苦的** .. 在 Sierra 10.13.1 上运行,是否有任何其他解决方法可以适应这个?难道是它在后台使用了一些重定向 url 机制?还是第一个 GET 是对 cookie 的请求?哪个用于下一个 POST 请求? 更新了问题以包含第一个 GET 请求的响应.. 【参考方案1】:

该令牌是一个 CSRF 令牌,您需要做的是在初始获取请求中收到的 html 响应中找到登录表单,并确保您存储了此响应中设置的 cookie。

然后,您需要在 html 响应中搜索用户名和密码输入字段旁边名为“token”的隐藏输入参数,并使用该元素的值来撰写您的发布请求。

可以使用一些正则表达式或 htmlagilitypack 以编程方式提取该令牌

【讨论】:

哇!谢谢你,先生!这正是我一直在寻找的......在仔细查看响应后,我能够找到嵌入在输入标签中的令牌。 提取隐藏在 GET 响应中的请求令牌后,我正在向同一个 uri 发布帖子。但是,它在响应中返回了一些 html,我猜是缺少了一些东西。我是否必须在我之前获得的 POST 的请求标头中设置 cookie? 没错!检索 cookie 并将其包含在发布请求中 这就是我现在正在尝试的:fr.getCookies().Add(new Cookie("__RequestVerificationToken", requestToken, "/", "somedomain.com")); var htmlPostRes = hrh.HttpPost("https://uriforserver", "\"username\":\"334\",\"password\":\"131\",\"__RequestVerificationToken\":\"'" + requestToken + "'\"", fr.getCookies()); 经过一番阅读,似乎 .net mvc csrf 需要匹配 cookie 中的令牌以及请求 formdata .. 这似乎不起作用。 .

以上是关于使用发布请求获取身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

Axios 拦截器未从 vuex 商店获取当前用户身份验证令牌

OAuth2RestOperations 使用从请求标头获取的令牌,而不是请求身份验证服务器

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

在刷新身份验证令牌时处理多个未经授权的请求

无法将令牌附加到 API 调用(基本身份验证、AFNetworking)

如何正确地将身份验证令牌放在 GET 请求的标头中