【问题标题】:Can't authenticate mobile client with node.js (using passport.js)无法使用 node.js 验证移动客户端(使用 passport.js)
【发布时间】:2014-07-15 17:25:51
【问题描述】:

我正在尝试使用 node.js 作为后端 API (express) 构建一些 CRUD 应用程序 和 web-app (backbone) 和移动客户端 (native android) 作为前端。(我是 node.js 初学者)

我的服务器解决方案基于以下出色的教程'easy-node-authentication'

在我的 android 应用程序中,我在使用 Google Plus SDK 完成身份验证步骤后设法获取了用户 Google-Token。(移动到 google-plus 直接请求)。

我正在尝试理解并找到正确而优雅的方式来重复使用给定的 google-token 并通过 Google-Plus 帐户再次验证我的 android 用户,以确保移动客户端拥有真正的令牌,然后添加一个新条目 ( id、token、email、name)到我的节点后端中的用户表数据库。

问题是:如果我想保持后端不变,下一步应该怎么做?我应该将带有令牌的 GET 请求作为 cookie 发送到 /auth/google 吗?也许到/auth/google/callback?另一个网址?这有意义吗?

请注意:我知道上面提到的“easy-node-auth”解决方案是基于会话和 cookie 的。话虽如此,我仍在尝试了解是否有一种方便的方式来集成(android 和 node),因为它适用于我的 web 应用程序和节点。

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

    好的,我在 facebook 身份验证方面遇到了同样的问题。最简单的方法是仅使用http://scotch.io/tutorials/javascript/easy-node-authentication-google 中描述的 SIGNUP 解决方案,但将 google auth LOGIN 保留在客户端。 无论客户端使用您的应用程序,您的身份验证流程都必须相同。 (浏览器、Android 应用等)

    所以你需要做以下事情(这里有很好的描述https://developers.google.com/accounts/docs/OAuth2UserAgent):

    1. 使用 AJAX 在浏览器端(使用 JS SDK)设置 Google oauth2 登录。 AJAX 响应应该包含某种访问令牌。

    2. 对于从浏览器或本地客户端发出的每个请求,在 Authorization 标头中发送 google 访问令牌,并使用 nodeJS 将其与 https://www.googleapis.com/oauth2/v1/tokeninfo 进行检查。这将为您提供用户 ID(您在注册阶段保存在数据库中)并检查令牌的有效性。

    所以它很急,但你应该摆脱在谷歌上进行 OAuth2 登录的护照模块。 事实证明,步骤 2 可以使用 nodeJS passport-google-token 模块完成!所以这不应该是太多的工作。

    祝你好运

    【讨论】:

    • 他们的 Facebook 有什么相似之处吗?
    • 感谢您的信息。我遇到了同样的问题,您的回答对我帮助很大。
    【解决方案2】:

    据我了解,这种情况有点独特,因为您有一个客户端(android 应用程序)在不使用后端应用程序的情况下进行了身份验证。但是后端应用程序将在后续请求中使用,您需要对该后端应用程序进行身份验证吗?如果是这样,那么我认为在您构建它时,您会遇到信任后端系统上的客户端的问题,除非它可以验证客户端的凭据。如果后端系统可以以某种方式验证此令牌(来自 Google)属于某个用户,那么您可以强制执行授权。否则,无论质量如何,后端系统都会信任所有拥有任何“令牌”的客户端(再次,如果我的理解有误,请纠正我)。

    如果后端系统可以是从 Google 检索此令牌的系统,这将使其负责身份验证,这可能会更好。客户端可能会发送必要的凭据,可以发送这些凭据以创建令牌。从那时起,您可以轻松地使用 cookie 在 HTTP 请求中来回传输令牌。

    另一种选择是使用用户名/密码组合构建单独的身份验证方案,该方案与手机检索的令牌分开。如果不以某种方式验证客户端,就很难保护后端中的数据(如果这是您的意图)不受任何客户端的影响。

    一旦您决定如何对用户进行身份验证,根据用户是否通过身份验证来限制您的 API 就相对容易(使用上面描述的 Passport 之类的东西)。在客户端,我发现一个简单的模式是在任何 API 返回 401(未授权)时将用户重定向到登录页面。

    【讨论】:

    • 确实,我正在尝试找到基于该机制'easy-node-auth-with-google' 的解决方案。该解决方案应重新验证给定的 google-token。 (由我的移动应用程序恢复)我的问题是:调用的正确 URL 是什么? /身份验证/谷歌?应该为 GET 请求提供哪些参数?谢谢。
    • 您是说要在后端应用程序中重复使用您在移动应用程序中获得的令牌(这是一个 OAuth2 令牌)吗?所以基本上用户授予您移动应用程序的权限,您使用相同的令牌在后端应用程序中对用户进行身份验证?如果是这样,我不确定这是否可能。如果您查看链接示例中的护照逻辑,他们正在使用回调中的信息创建一个新用户,然后在后续请求中使用该用户。他们似乎没有使用令牌。您需要用户详细信息吗?
    • 是的。基本上,我正在寻找任何传统方法来在我的节点服务器中验证我的移动应用程序用户。我不担心用户数据,因为它可以稍后由手机手动发送,任何解决这种情况的适当方法都将被接受。 (验证并在我的服务器中为已经通过 google-plus android 验证的用户创建一个条目)。
    • 你第一次提到你想重新验证给定一个谷歌令牌,但现在说任何传统方法都可以吗?如果任何方法有效,则用户名/密码将有效。如果您想坚持使用 Google OAuth2,那么您可以构建上面链接的解决方案。我想说的是,您可能不想both -- 在移动应用程序上进行身份验证 在后端应用程序上进行身份验证。如果您在后端应用程序中存储了额外的安全数据,您可能只想在那里进行身份验证,而不是移动应用程序。
    • 我的意思是通过给定的 google-token 重新验证我的移动应用程序的任何传统方法,因为正如您所写,我必须确保移动用户持有真正的 google-token。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    相关资源
    最近更新 更多