在尝试实施Passport模块并决定对我不知道幕后发生的事情感到太不舒服之后,我想出了用Facebook自己验证移动用户的方法。以下是我的方法,但我担心我可能会遗漏一些重要的东西,因为我是新手。任何见解都将不胜感激。
重要提示:每位用户都必须使用Facebook登录。
移动客户端使用Facebook API对用户进行身份验证并收到access_token。
对具有用户特定/特权操作的node.js服务器的每个后续请求都将包含该用户的唯一ID和当前的Facebook access_token。
请求将通过sails.js策略(中间件),该策略将请求中的Facebook access_token与当前保存到该数据库中该用户的User对象的access_token进行比较。
如果匹配,请求将继续执行所需的操作。如果它们不匹配,服务器将使用请求提供的访问令牌呼叫graph.facebook.com/me/?access_token=
。
如果从Facebook服务器返回的唯一Facebook ID与初始注册时已保存到该用户的User对象的Facebook ID匹配,则新的access_token将保存/刷新到该User对象,并且请求继续到所需的动作。
同样重要的是:移动客户端将自动刷新Facebook access_token,并根据需要将其包含在对我服务器的请求中。
提前致谢!
答案 0 :(得分:3)
这不是一个好主意。我将在此详细解释原因,但一般情况下:使用护照或Stormpath等安全身份验证提供程序。原因是:安全性很难做到。特别是当您从不同的地方(网络应用程序,API,移动应用程序等)进行身份验证时。有很多方法可以解决问题,从长远来看,不仅使用经过严格审查的框架,它还会花费很多。
现在,您可以解决实施问题:
移动客户端使用Facebook API对用户进行身份验证并收到 的access_token。
这很好,这很有道理。
我的node.js服务器的每个后续请求 用户特定/特权操作将包含该用户的唯一ID 和当前的Facebook access_token。
生成的唯一ID在哪里?是Facebook用户ID吗?如果是这样,请不要将此标记传递给OUTSIDE - 将其保留在内部并仅通过HTTP Authorization标头传递令牌。这将确保您尽可能少地泄漏信息。
请求将通过sails.js策略(中间件) 比较请求中的Facebook access_token到 access_token当前从数据库保存到该用户的User对象。
这是一个坏主意。相反,您应该使用JWT库验证令牌(Facebook令牌是JWT)。然后,您应该使用令牌激活对Facebook Graph API的请求,以验证它是否已被撤销。这可以确保如果您的用户遭到入侵,您可以在需要时实际撤消访问权限。
如果匹配,请求将继续执行所需的操作。如果 他们不匹配,服务器将拨打电话 提供访问令牌的tograph.facebook.com/me/?access_token= 来自请求。
以上评论也适用于此。
如果从Facebook服务器返回的唯一Facebook ID与 已经保存到该用户的User对象的Facebook ID 初始注册然后保存/刷新新的access_token User对象和请求继续执行所需的操作。
以上评论也适用于此。
注意:我是Node.js和Python中几个流行的身份验证库(包括社交登录)的作者,并且花费我所有的时间来处理@ my company的这些东西。
身份验证非常有趣/有趣,但除非你绝对100%确定你做的一切都是正确的,否则使用经过严格审查的框架总是更好的主意=)< / p>
我真的希望这会有所帮助!祝你的项目好运!我确定它会很棒。
PS :无论如何,请务必在与您的API服务交谈时使用SSL,否则无论如何都不重要:(