9

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

这是我当前设置的概述。

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

现在我想将同样的登录功能扩展到我的移动客户端。

我看到 2 个选项

  1. 在移动客户端中嵌入应用程序 ID 和应用程序密码,并从移动应用程序直接向 FB 或 Twitter 进行 oAuth 调用

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

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

我有代理方法主要工作。

  1. 我在我的移动客户端中打开一个 WebView 并将其指向http://mysever/auth/twitter
  2. 这将贯穿我现有的 passport.js 代码,并将移动 WebView 重定向到 Twitter 登录页面。
  3. 然后,用户在设备上的推特网页上输入他们的信用。
  4. Twitter 然后调用我的 oAuth 回调 URL(这是我的 nodejs 网络服务器)。
  5. 我的服务器和 Twitter 处理获取用户个人资料信息的第四次握手(据我了解,这是这种方法的关键,我的服务器和 Twitter 处理握手,移动客户端无需执行任何操作或通过此过程中的任何令牌

这是我的问题

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

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

我唯一想出的就是让我的网络服务器将移动客户端浏览器“重定向”到一个在查询字符串中包含用户信息的虚假 URL。类似 myapp://info?userid=1234

然后在移动应用程序中,我可以劫持 URL 加载并获取此 url 并获取我需要的数据。然后,我可以存储此用户信息,关闭 WebView 控件并转到我的移动应用程序中的本机屏幕,并在对我的 nodejs 服务器的任何后续 REST 调用中使用用户信息,作为识别用户的一种方式。

由于多种原因,这非常笨拙。其中最大的原因是 url 是通过未加密的线路发送的,并且所有数据都是纯文本的。

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

还是我做错了?

4

2 回答 2

3

为 Xamarin(适用于 iOS 和 Android)实现 oauth 的最直接方法是使用Xamarin.Auth。客户端的入门文档在这里。我认为它应该安全地维护一切,您不必担心必须将节点服务器用作代理。

您需要在调用过程中提供您的应用程序 ID,但我不需要担心太多或任何安全问题。

我知道这与您已经实现的内容背道而驰,但也许这有助于简化一些事情。

于 2013-02-14T23:55:29.020 回答
0

这与我一直在处理的困境相同。这就是我目前的处理方式。在我的应用程序中,客户可以直接来,也可以通过其他服务来,例如 facebook,这是我的主要服务,因此也是我专注的服务。

Facebook 可以通过 POST(桌面应用程序)或 GET(移动设备)重定向。

我检查初始请求,看看是否有服务标识符 - 例如,这里是 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 为您提供了一个代码,您可以用它交换访问令牌,但我遇到了问题,只是选择绑定到护照系统。

如果客户直接来,我会检查会话或与本地策略相关的加密 cookie。然后,这会检查数据库中的访问令牌,例如,该令牌可用于访问 facebook api。

如果客户无法识别,他们可以选择通过 facebook、google 等进行身份验证。

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

connect.sid - 加密的 cookie

userId - 加密的 cookie

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

于 2013-02-15T08:07:11.540 回答