Oauth 2.0 来自IWebBrowser2的HTTP响应头

Oauth 2.0 来自IWebBrowser2的HTTP响应头,oauth-2.0,http-headers,iwebbrowser2,Oauth 2.0,Http Headers,Iwebbrowser2,与此非常相似,我试图在响应头中获得一个特定的值。它引用了一个使用处理程序的链接,但是由于解决方案已经过时,链接已经失效 也许我没有正确地处理这个问题 概述: 我正在扩展我在C++(桌面应用程序)中编写的OAuth2库,它对于谷歌API来说是很好的,现在允许与微软协商。如上所述(在“成功登录后重定向请求”下),验证代码将在响应标头的字段中返回。使用HTTP调试器,我可以看到发送的值(见下文) 当试图从中获取接口时,所有属性都不包含我使用HTTP调试器可以看到的值,并且这些调用使用各种值成功,即使响

与此非常相似,我试图在响应头中获得一个特定的值。它引用了一个使用处理程序的链接,但是由于解决方案已经过时,链接已经失效

也许我没有正确地处理这个问题

概述: 我正在扩展我在C++(桌面应用程序)中编写的OAuth2库,它对于谷歌API来说是很好的,现在允许与微软协商。如上所述(在“成功登录后重定向请求”下),验证代码将在响应标头的字段中返回。使用HTTP调试器,我可以看到发送的值(见下文)

当试图从中获取接口时,所有属性都不包含我使用HTTP调试器可以看到的值,并且这些调用使用各种值成功,即使响应头中不存在“Location”字段(这显然不是需要的)

这是唯一的障碍。所有后续调用和请求,我都使用WinHTTP API,响应头都是。然而,这个阶段仍然是用户可以在浏览器中正确验证和授权应用程序的阶段。我感谢你的时间和帮助

更新: 响应类似于以下内容:

HTTP/1.1 302 Found
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Encoding: gzip
Location: urn:ietf:wg:oauth:2.0:oob?code=[VALUE]

在这种情况下,不需要获取响应头。身份验证代码还作为查询参数传递给重定向url

Invoke
函数中实现并获取url:

HRESULT __stdcall DWebBrowserEvents2::Invoke(_In_ DISPID dispIdMember,
                                             _In_ REFIID riid,
                                             _In_ LCID lcid,
                                             _In_ WORD flags,
                                             _In_ DISPPARAMS *pDispParams,
                                             _Out_opt_ VARIANT *pVarResult,
                                             _Out_opt_ EXCEPINFO *pExcepInfo,
                                             _Out_opt_ UINT *puArgErr);
何时发现

// new document goes ReadyState_Complete
dispIdMember == DISPID_DOCUMENTCOMPLETE  [ 259 ]
url是位于此处的变体:

VARIANT *vurl = pDispParams->rgvarg[0].pvarVal; // <-- not bstrVal

如果有
位置:
标题,则应该有
301
302
重定向响应代码,这些代码通常会自动跟随。新的响应头将不具有该
位置
头。可能是这样吗?是的,我会更新这个问题。
IHTMLDocument2
不公开对HTTP头的访问
ihtmlocation
表示实际加载到当前文档中的最终URL,因此它永远不会表示指向该最终URL的HTTP重定向提供的任何中间URL。对于您尝试执行的操作,您可能必须发出自己的HTTP请求,例如使用WinInet/WinHTTP或任何其他HTTP库,然后手动将生成的HTML加载到WebBrowser实例中(如果需要向用户显示)。
BSTR url = (vurl->vt & VT_BYREF) ? *vurl->pbstrVal : vurl->bstrVal;
std::wstring ws(url, SysStringLen(url));

// url will look similar to the following:
// http://localhost/?code=[...]&session_state=[...]