我似乎找不到任何关于如何使用 Meteor 的 DDP 对用户进行身份验证的好信息。
这可能吗?如果是这样,最好的方法是什么?如何使用 SRP 远程登录 Meteor?
我目前正在使用直接节点(最终将使用 Express),以及 this node ddp client .
最佳答案
要通过 DDP 登录,只需发送一个方法调用。您可以根据您想要登录的方式稍微更改它。
我将使用 ddp-tools尝试解释如何登录,因为它将与纯粹的 ddp 进行通信。以下示例中的登录详细信息是
用户名是 user_1 ,密码是 qwerty (是的,我知道它不好),电子邮件地址是 email@email.com ,登录 token 为 MxNY9BFPKra2uNWG7
格式是
ddp call <method call name> [<param1>..]
这与执行 ddpclient.call(<method call name>,<param1>,callback)
相同在nodejs中使用电子邮件和密码登录
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步:- 开始 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 交换(来自 meteor SRP 包中的 SRP 库),因为您使用的是 node.js,所以您可以在项目中包含所有文件(package.js 除外)
var srp = new SRP.Client(password);
这会给你A
,然后您将获得可以响应的数据:var response = srp.respondToChallenge(result);
这最终将为您提供 SHA 哈希以使用“M”进行回复,并使用“B”和盐。最后
登录时不要忘记检查最终响应,以查看结果是否与应有的相符
srp.verifyConfirmation({HAMK: result.HAMK}
同样,这些都来自 Meteor 中的 SRP 库,但它们都是 SRP 规范的一部分,如 wikipedia . Meteor 的 SRP 使用 SHA256 作为散列函数。例子:
关于authentication - 通过 DDP(和 SRP?)使用 Meteor 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16729992/