IWebBrowser2

时间:2015-11-20 19:35:24

标签: oauth-2.0 http-headers iwebbrowser2

与此question非常相似,我试图在响应标头中获取特定值。它使用pass-through solution处理程序引用Asynchronous Pluggable Protocol (APP),但由于解决方案已过时,链接已失效。

也许我接近这个错误。

概述: 我正在扩展我用C ++(桌面应用程序)编写的OAuth2库,该库适用于Google API,现在允许与Microsoft协商。正如在this site上所引用的(在成功登录后重定向请求'下),在响应标头的Location字段中返回验证码。使用HTTP调试器,我可以看到发送的值(见下文)。

尝试从IHTMLLocation获取IHTMLDocument2接口时,没有任何属性包含我使用HTTP调试器可以看到的值,并且即使在“位置”字段中,这些调用也会成功使用各种值响应头中不存在(这显然不是所需的)。

这是唯一的挂断。所有后续调用和请求,我使用WinHTTP API,响应头是easily accessed。但是,此阶段仍然是用户可以在浏览器中正确验证和授权应用程序的位置。感谢您的时间和帮助。

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

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]

1 个答案:

答案 0 :(得分:0)

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

实施DWebBrowserEvents2,并获取Invoke函数中的网址:

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 ]

网址是位于此处的变体:

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

转换为BSTR,然后是字符串:

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=[...]