Node.js ";对",;从移动客户端执行oAuth的方法

Node.js ";对",;从移动客户端执行oAuth的方法,node.js,oauth,xamarin.ios,xamarin.android,passport.js,Node.js,Oauth,Xamarin.ios,Xamarin.android,Passport.js,我正在构建一个跨平台的移动应用程序(使用Xamarian工具,MonoTouch/MonoDroid)。我正在尝试完成身份验证工作流,但遇到了一个绊脚石。我到处寻找一个明确的答案,但还没有找到 下面是我当前设置的概述 我有一个内置nodejs的网站。 我使用passport.js在网站上进行oAuth登录。这非常有效,用户可以使用Twitter或Facebook登录到我的网站 现在我想将同样的登录功能扩展到我的移动客户端 我有两个选择 将应用程序id和应用程序机密嵌入移动客户端,并从移动应用程序

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

下面是我当前设置的概述

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

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

我有两个选择

  • 将应用程序id和应用程序机密嵌入移动客户端,并从移动应用程序直接向FB或Twitter拨打oAuth电话

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

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

    我的代理方法基本上是有效的

  • 我在移动客户端中打开一个WebView,并将其指向
    http://mysever/auth/twitter
  • 这将通过我现有的passport.js代码运行,并将移动网络视图重定向到Twitter登录页面
  • 然后,用户在设备上的twitter网页上输入他们的信用
  • Twitter然后调用我的oAuth回调URL(这是我的nodejsweb服务器)
  • 我的服务器和Twitter在获取用户配置文件信息的第四次握手时处理背面问题(据我所知,这是这种方法的关键,我的服务器和Twitter处理握手,移动客户端在此过程中无需做任何事或传递任何令牌
  • 这是我的问题

  • 正是这最后一步让我难堪。在我的服务器上完成握手后,我就在服务器上获得了所需的用户信息,需要将其发送回移动客户端应用程序

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

  • 我唯一想到的是让我的web服务器将移动客户端浏览器“重定向”到一个假URL,该URL在查询字符串中包含用户信息。差不多myapp://info?userid=1234

    然后在移动应用程序中,我可以劫持URL加载并抓取此URL并获取我需要的数据。然后,我可以将这个userinfo隐藏起来,关闭WebView控件并转到我的移动应用程序中的本机屏幕,然后在对nodejs服务器的任何后续REST调用中使用userinfo,作为识别用户的一种方法

    由于多种原因,这是一个巨大的难题。其中最大的一点是,url是通过未加密的线路发送的,并且所有数据都是纯文本

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


    还是我做错了?

    在iOS和Android上为Xamarin实现oauth最简单的方法是使用。客户机的初学者文档是。我认为它应该安全地维护所有内容,您不必担心必须将节点服务器用作代理

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


    我知道这与您已经实现的相反,但这可能有助于简化一些事情。

    这与我一直在处理的难题相同。 这就是我目前的处理方式。 在我的应用程序中,客户端可以直接访问,也可以通过其他服务访问,比如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的帖子稍有不同,你可以在base64url中获得一个访问令牌编码。GET给了你一个代码,你可以用它交换一个访问令牌,但我有问题,只是选择了绑定到passport系统

    如果客户端直接访问,我会检查会话或与本地策略关联的加密cookie。然后检查db是否有访问令牌,例如,该令牌可用于访问facebook api

    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、google等进行身份验证

    主要的是,客户端只存储了两条信息:passport会话id和my app用户id

    connect.sid-加密cookie

    用户ID-加密cookie


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

    有趣的是,我还没见过这个图书馆。谢谢你的链接。看起来这与RestSharp提供的基本相同(这实际上是我的选项1)。对于oAuth1(Twitter),我认为这意味着我必须将我的应用程序机密嵌入到移动部署包中,对吗?啊,是的,RestSharp具有相同的OAuth功能。对于OAuth1,没有太多好的选择。要么嵌入,要么使用代理,就像你开始做的那样。如果你嵌入了密钥,你可能会混淆密钥或者试图将它们存储在一个安全的位置,但是不能保证它们不会被盗。我认为这篇文章是对这个主题的一个相当好的概述:。是的,我读了那个帖子。但确实没有一个解决方案。除了说oAuth不是客户端应用程序的正确解决方案之外。我越来越认为,仅仅在oAuth上下赌注是移动应用程序的更好解决方案。我认为OAuth2是可行的,但是对于客户来说