从移动客户端做oAuth的"正确"方式

Bra*_*ham 9 oauth xamarin.ios node.js xamarin.android passport.js

我正在构建一个跨平台的移动应用程序(使用Xamarian工具,MonoTouch/MonoDroid).我正在尝试通过身份验证工作流程,并遇到了绊脚石.我已经搜遍了一个明确的答案,但还没有找到它.

以下是我当前设置的概述.

我有一个内置在nodejs的网站.我使用passport.js在网站上进行oAuth登录.这很好用,用户可以使用Twitter或Facebook登录我的网站.

现在我想将这个相同的登录功能扩展到我的移动客户端.

我看到2个选项

  1. 将app id和app secret嵌入移动客户端,并通过移动应用程序直接向FB或Twitter发出oAuth调用

  2. 代理oAuth通过我现有的nodejs Web服务器调用(保留服务器上的密钥)

选项2似乎是首选方式(因为它避免了在移动应用程序中"运送"秘密).

我的代理方法主要是工作.

  1. 我在我的移动客户端中打开一个WebView并指向它 http://mysever/auth/twitter
  2. 这将通过我现有的passport.js代码运行,并将移动WebView重定向到Twitter登录页面.
  3. 然后,用户在设备上的Twitter网页上输入他们的信用卡.
  4. 然后Twitter调用我的oAuth回调URL(这是我的nodejs web服务器).
  5. 我的服务器和Twitter处理获得用户配置文件信息的第四次握手(据我所知,这是这种方法的关键,我的服务器和Twitter处理握手,移动客户端不必做任何事情或通过这个过程中的任何令牌)

这是我的问题:

  1. 这是困扰我的最后一步.在我的服务器上完成握手后,我在服务器上获得了所需的用户信息,并需要将其发送回移动客户端应用程序

    我无法弄清楚WebView控件中的任何方式来获取响应对象并获取cookie或标头值(例如)(对于Android和iOS来说这似乎是正确的).我不认为它是特定于平台的.我想我正试图做一些移动平台上的WebView小部件不支持的东西.这让我觉得我错过了一些明显的东西.

我唯一想到的是让我的网络服务器将移动客户端浏览器"重定向"到在查询字符串中包含用户信息的虚假URL.像myapp:// info?userid = 1234之类的东西

然后在移动应用程序中,我可以劫持URL加载并获取此URL并获取我需要的数据.然后,我可以存储此userinfo,关闭WebView控件并转到我的移动应用程序中的本机屏幕,并在任何后续REST调用中将userinfo用户命名为我的nodejs服务器,以识别用户.

由于多种原因,这是大规模的kludgy.其中最大的一点是,网址是通过未加密的网络发送的,并且所有数据都是纯文本的.

必须有更好的方法将数据从Web服务器返回到移动客户端?

或者我做错了吗?

Mik*_*nis 3

对于 iOS 和 Android 而言,为 Xamarin 实现 oauth 的最直接方法是使用Xamarin.Auth。客户端的入门文档位于此处。我认为它应该安全地维护所有内容,您不必担心必须使用节点服务器作为代理。

作为通话的一部分,您需要提供您的应用程序 ID,但我不需要担心太多或任何安全问题。

我知道这与您已经实施的内容背道而驰,但这也许可以帮助简化一些事情。