自己写的一个MFC程序,使用Oauth2.0来登录Google 的服务。 实现方式虽然很多,但我想了想,比较可行的有下面两个 :1. 登录时直接调用ShellExecute()打开登录页面,用户完成登录和确认后,程序检测该页面title的变化,取得相应的 authorization code.  这个实现的难点在于: 如何用MFC程序取得网页的title, 特别是针对不同浏览器 IE, firefox, chrome,以及不同的浏览方式(独立窗口,tab),如何才能保证在所有情况下都能获取到该特定页面的title ? 请做过的大侠指点。2. 登录时,弹出 自己的窗口,嵌入一个IE浏览器,让用户进行登录。由于窗口是自己控制的,比较容易处理。  我大体看了一下,好像要用到COM中的IWebBrowser2接口,但MSDN中说明,在IE7以后已经不好用了, 不知道有没有人用过这种方式。能具体说一下实现要领么?谢谢了,分不够可以再加。

解决方案 »

  1.   

    我用纯JS代码实现了OAUTH登陆新浪微博并能写带图片的微博,不过不能运行在浏览器环境中,只能在应用中使用。不会出现登录页面,因为JS已经模拟了登录页面且获取到授权码了。
    MFC的没做过,不是说登录麻烦,而是搞那些API麻烦,所以全用AJAX代替了。
      

  2.   


    第2个方法:Internet Explorer 7 and later. It is not possible to use CoCreateInstance to open an instance of Internet Explorer as a new tab in an existing window. 
    MSDN的大意应该是针对在一个Window中采用多IWebBrowser2实例做TAB页这种应用。对于OAuth,你的登陆窗口就一个,使用的IWebBrowser2实例也就一个,不会有这种问题的。
      

  3.   

    TO dream238, 谢谢,第二种方法最担心的问题是: 这个IE窗口完全由应用程序来控制,那不是理论上应用程序也可以获取用户输入的 用户名和密码了么 ? 这个是不是就丧失了Oauth设计的本意? 我希望给用户提供一个绝对放心的登录环境。  这个方面还有些疑问。
      

  4.   


    用户的登陆操作,是在官方的HTTPS网页里进行的,客户端是获取不到用户名与密码的。
    客户端只是提供了一个网页登陆的入口而已。
      

  5.   

    如果客户端不断的用程序检测html页面中的username 和password输入框中的值,不是就可以获取用户的密码了么? 
      

  6.   

    to Oyljerry, 哈哈,我也叫jerry.  我现在已经基本决定采用第二种方式. 但具体实现还是有些疑问。 我试了试,有几种方法: 
    1. 使用CHtmlView(或派生类), 试了一下用户体验效果挺好,但由于是个View类,需要mfc的Document-view结构才好用,而我主程序采用的是MFC的document-view框架,登录时希望直接弹出窗口。 这个比较麻烦。2. 使用CDialog派生类,在里面放上一个Web Browser的Active X控件, 这个可以满足弹出窗口的要求,但却存在一个很重要的不足, 窗口的title是dialog固定的title(caption),而我需要读取IE窗口(控件)实际的title,因为title上面显示了auth token. 3. 使用ShowHTMLDialog() (在mshtml.dll中的), 但我在Win7/IE9环境中试了一下,这种方式在cookie处理, url跳转方面都存在问题,无法正常的进行认证和跳转。不知道大家的建议是什么? 谢谢了