我似乎找不到任何关于如何使用Meteor的DDP对用户进行身份验证的好信息。
这个是可能的吗?如果是这样,最好的方法是什么?如何使用SRP远程登录Meteor?
我目前正在使用Express(最终将使用Express),以及this node ddp client。
发布于 2013-09-06 04:15:58
要通过DDP登录,只需发送一个方法调用。您可以根据您想要的登录方式对其稍作修改。
我将使用ddp-tools来尝试并解释如何登录,因为它将与纯ddp通信。以下示例中的登录详细信息为
用户名是user_1,密码是qwerty (是的,我知道它是坏的),电子邮件地址是email@email.com,,登录令牌是MxNY9BFPKra2uNWG7
格式为
ddp call <method call name> [<param1>..]这与在nodejs中做ddpclient.call(<method call name>,<param1>,callback)相同
使用电子邮件和密码登录的
ddp call 'login' '{"password":"qwerty","user":{"email":"email@email.com"}}'使用用户名和密码登录的
ddp call 'login' '{"password":"qwerty","user":{"username":"user_1"}}'使用 token 登录的(登录时meteor会保存什么内容
ddp call 'login' '{"resume":"MxNY9BFPKra2uNWG7"}'--
难点: SRP
如果您不想像上面那样以纯文本方式发送密码,那么您没有使用SSL安全/https连接,您可以使用SRP。
使用SRP登录有点棘手,因为它有几个阶段
1. Begin a passwordExchange to establish the key to communicate the hash
2. Send a login call with the hash calculated using the reply from 1)步骤1:
-Begin a SRP密码交换:
ddp call 'beginPasswordExchange' '{"A":"A","user":{"email":"email@email.com"}}响应将如下所示
{"identity":"identity","salt":"salt","B":B"}然后,您可以使用此命令进行登录:
ddp call 'login' '{"srp":{"M":"srp hash"}}'同样,您可以使用用户名而不是上面的电子邮件。
因此,要获得M和A的值,您需要一个SRP库。因为在meteor中有一个SRP库,所以很容易解释如何从每个库中获取密码,所以它相当棘手。如果您想用另一种语言编写方法,您可以使用wikipedia's explanation来构建方法
因此,我们开始一次srp交换(来自meteors SRP包中的SRP库),因为您使用的是node.js,所以您可以包含项目中的所有文件(除了package.js)。
var srp = new SRP.Client(password);这将为您提供A,然后您将获得可以响应的数据:
var response = srp.respondToChallenge(result);这将最终给出使用'M‘的SHA哈希,接受'B’和盐。
最终
请不要忘记在登录时检查最终响应,以查看结果是否与预期结果匹配
srp.verifyConfirmation({HAMK: result.HAMK}同样,这些都来自于流星的SRP库,但它们都是SRP规范的一部分,就像在wikipedia上一样。Meteor的SRP使用SHA256作为散列函数。
示例:
发布于 2015-08-18 20:25:41
A package现在正在执行登录部分,将loginWithPassowrd方法添加到DDP连接。
meteor add ongoworks:ddp-login然后:
// Get the connection
var conn = DDP.connect(Meteor.absoluteUrl());
// Pass the connection to `DDP.loginWithPassword`, which is otherwise similar to
// the core `Meteor.loginWithPassword` method.
DDP.loginWithPassword(conn, {username: 'admin'}, 'admin', function (error) { ... })发布于 2013-07-10 05:11:58
我找到的最接近的是这个,但它是在神秘的Objective-C :-P https://github.com/boundsj/ObjectiveDDP/blob/master/Example/Example/LoginViewController.m中
它调用的函数是用C编写的:https://github.com/boundsj/ObjectiveDDP/blob/master/ObjectiveDDP/srp/srp.c
Meteor的SRP单元测试在这里:https://github.com/meteor/meteor/blob/master/packages/srp/srp_tests.js
Meteor srp的代码在这里:https://github.com/meteor/meteor/blob/master/packages/srp/srp.js
您至少需要这样:https://github.com/jedp/node-srp
祝好运。我正在试图弄清楚如何在Java中做到这一点,它比大多数加密方案更隐蔽。最难的部分是弄清楚Meteor是如何对身份进行编码的,但这是在Meteor srp代码中,因为它是Javascript,所以您可能可以将其提升:-)
https://stackoverflow.com/questions/16729992
复制相似问题