无法通过 node.js(使用 passport.js)对移动客户端进行身份验证

7
我正在尝试使用node.js作为后端API(express)、web应用(backbone)和移动客户端(原生android)作为前端来构建一些CRUD应用程序。(我是node.js的初学者)
我的服务器解决方案基于以下优秀的教程'easy-node-authentication'
在我的android应用中,我已经成功获取了用户的Google-Token,在完成了Google Plus SDK的身份验证步骤后。(移动端直接向google-plus请求)
我正在尝试理解并找到正确和优雅的方式来重复使用给定的google-token,并通过Google-Plus帐户再次对我的android用户进行身份验证,以确保移动客户端持有真实令牌,然后将一个新条目(id、token、电子邮件、姓名)添加到我的节点后端的用户表DB中。
问题是:如果我想保持我的后端不变,我的下一步应该是什么?我应该发送一个带有令牌作为cookie的GET请求到/auth/google?也许是到/auth/google/callback?还是其他URL?这有意义吗?
请注意:我知道上述提到的“easy-node-auth”解决方案是基于会话和cookie的。话虽如此,我仍在努力理解是否有一种方便的方式将Android和Node集成,因为它对我的Web应用程序和Node运作良好。
2个回答

2
据我理解,这种情况有点独特,因为您有一个已经完成身份验证但未使用您的后端应用程序进行身份验证的客户端(Android应用)。 但是,在随后的请求中将使用后端应用程序,并且您需要对该后端应用程序进行身份验证? 如果是这样,那么在构建此过程时,您将遇到信任后端系统上的客户端的问题,除非它可以验证客户端的凭据。 如果后端系统可以以某种方式验证此令牌(来自Google)属于某个用户,则可以强制执行授权。 否则,后端系统将信任具有任何“令牌”的所有客户端,无论其质量如何(如果我理解错误,请纠正我)。
如果后端系统能够从Google检索此令牌,则最好由后端系统检索此令牌,这将使其负责身份验证。 客户端可能会发送必要的凭据,这些凭据可以被发送以创建令牌。 从那时起,您可以轻松使用cookie在HTTP请求中传输令牌。
另一种选择是构建单独的身份验证方案,使用用户名/密码组合,该方案与手机检索的令牌分开。 只是很难保护后端中的数据(如果这是您的意图)免受未经验证的任何客户端的攻击。
一旦您决定如何对用户进行身份验证,基于用户是否经过身份验证限制您的API相对容易(使用像上面描述的Passport这样的东西)。 在客户端方面,我发现遵循一个简单的模式是如果任何API返回401(未经授权),则将用户重定向到登录页面。

实际上,我正在尝试找到一个基于'easy-node-auth-with-google'机制的解决方案。该解决方案应该重新验证给定的Google令牌(由我的移动应用程序恢复)。我的问题是:正确的调用URL是什么?/auth/google?GET请求应该提供哪些参数?谢谢。 - Pazinio
你是说你想在后端应用程序中重复使用你在移动应用程序中获取的令牌(这是一个OAuth2令牌)吗?所以基本上用户在你的移动应用程序上授予你权限,然后你使用相同的令牌在后端应用程序中对用户进行身份验证?如果是这样,我不确定是否可能。如果你看一下你链接的示例中的passport逻辑,他们使用回调中的信息创建一个新用户,然后在后续请求中使用该用户。似乎他们没有使用令牌。你需要用户详细信息吗? - dylants
是的。基本上,我正在寻找任何传统方法来在我的节点服务器中验证我的移动应用程序用户。我不担心用户数据,因为它可以稍后由移动设备手动发送,任何适当的解决此情况的方式都将被接受。(对于已通过Google Plus Android进行身份验证的用户进行身份验证并在我的服务器内创建条目)。 - Pazinio
你最初提到想要通过谷歌令牌重新认证,但现在说任何常规方法都可以?如果任何方法都可以,那么用户名/密码就可以。如果你想坚持使用Google OAuth2,则可以构建上述链接的解决方案。我的意思是你可能不想同时在移动应用程序和后端应用程序上进行身份验证。如果你在后端应用程序中存储了其他安全数据,你可能只想在那里进行身份验证,而不是在移动应用程序中进行身份验证。 - dylants
我指的是通过任何传统方法使用给定的 Google 令牌重新验证我的移动应用程序,因为正如您所写的那样,我必须确保移动用户持有真实的 Google 令牌。 - Pazinio
似乎有一个方法userProfile,它接受一个令牌并在回调中返回用户详细信息。此函数可从您为护照配置创建的主要GoogleStrategy对象访问。一种选择是将令牌发送到后端服务器,并让该服务器尝试通过该函数查找用户详细信息,这将记录用户登录。 - dylants

2
我跟你有同样的问题,需要进行Facebook身份验证。最简单的方法是仅使用在http://scotch.io/tutorials/javascript/easy-node-authentication-google中描述的SIGNUP解决方案,并保持Google认证LOGIN在客户端上。
无论使用何种客户端应用程序(浏览器,Android应用程序等),您的验证流程都必须相同。
因此,您需要执行以下操作(在https://developers.google.com/accounts/docs/OAuth2UserAgent中有很好的描述):
1. 使用AJAX在浏览器端设置Google oauth2登录(使用JS SDK)。 AJAX响应应包含某种访问令牌。 2. 对于从浏览器或本机客户端发出的每个请求,请在Authorization头中发送Google访问令牌,并使用nodeJS将其与https://www.googleapis.com/oauth2/v1/tokeninfo进行检查。这将为您提供用户ID(在注册阶段保存在数据库中)并检查令牌的有效性。
所以痛苦但是你应该摆脱做OAuth2登录到Google的护照模块。事实证明,步骤2可以使用nodeJS passport-google-token模块完成!因此,这不应该太困难。
祝你好运

有没有类似于 Facebook 的东西? - Harshil Lodhi
谢谢提供的信息。我也遇到了同样的问题,你的答案帮了我很多。 - Harshil Lodhi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接