从移动客户端执行oAuth的“正确”方式

我正在构build一个跨平台的移动应用程序(使用Xamarian工具,MonoTouch / MonoDroid)。 我正在尝试通过身份validation工作stream程,正在陷入绊脚石。 我已经搜遍了一个明确的答案,还没有find它。

这里是我目前的设置的概述。

我有一个build在nodejs中的网站。 我使用passport.js在网站上进行oAuthlogin。 这很好,用户可以使用Twitter或Facebooklogin到我的网站。

现在我想将这个相同的loginfunction扩展到我的移动客户端。

我看到2个选项

  1. 将应用程序ID和应用程序密码embedded到移动客户端,并从移动应用程序直接向FB或Twitter发送oAuth调用

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

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

我有代理方法主要工作。

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

这是我的问题

  1. 这是我的最后一步。 一旦我的服务器上的握手完成,我有我需要在服务器上的用户信息, 需要将其发送回移动客户端应用程序

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

我唯一想到的是让我的networking服务器将移动客户端浏览器“redirect”到查询string中具有用户信息的假URL。 像myapp:// info?userid = 1234

然后在移动应用程序中,我可以劫持URL加载,并抓住这个url,并获得我需要的数据。 然后,我可以隐藏这个用户信息,closuresWebView控件,并移动到我的移动应用程序中的本地屏幕,并在随后的REST调用中将用户信息作为识别用户的手段用于我的nodejs服务器。

由于多种原因,这是大规模的。 其中最大的一点就是url是通过未encryption的线路发送的,并且所有的数据都是纯文本的。

从Web服务器获取数据返回给移动客户端还有更好的方法吗?

还是我做错了?

Xamarin实现oauth的最直接的方法是使用Xamarin.Auth 。 客户的入门文档就在这里 。 我认为它应该保证一切安全,您不必担心必须使用您的节点服务器作为代理。

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

我知道这是违背了你已经实施,但也许这可以帮助简化一点。

这是我一直处理的同样的困境。 这是我目前处理它的方式。 在我的应用程序客户端可以直接或通过另一个服务,如我主要的Facebook,因此我已经集中在一个。

Facebook可以通过POST(桌面应用)或GET(手机)进行redirect。

我检查最初的请求,看看是否有一个服务标识符 – 这里是Facebook的GET例如。

 app.get('/', function(req, res) { var paraUrl = URL.parse(req.url,true).query; //The fb_source is shown - //i need to go striaght to the facebook authorization since //its coming from //from a mobile device. if (paraUrl.fb_source){ res.redirect('/auth/facebook'); //this is the passport part return; } res.sendfile('index.html'); } 

facebook的POST稍有不同,因为你在base64url中获得一个访问令牌编码。 GET给了你一个代码,你可以换取访问令牌,但是我遇到了问题,只是select了绑定到护照系统。

如果客户端是直接访问的,我会检查会话或与本地策略相关的encryptioncookie。 这然后检查数据库的访问令牌,例如可以用来访问Facebook的API。

如果一个客户端无法识别,他们可以select通过Facebook,谷歌等authentication

最主要的是只有2条信息与客户端,护照会话ID和我的应用程序用户ID一起存储

connect.sid – encryption的cookie

userId – encryption的cookie

我想知道其他人是如何处理问题的