我似乎找不到任何关于如何使用 Meteor 的 DDP 对用户进行身份验证的好信息。
这可能吗?如果是这样,最好的方法是什么?如何使用 SRP 远程登录 Meteor?
我目前正在使用直接节点(最终将使用 Express)以及此节点 ddp client。
我似乎找不到任何关于如何使用 Meteor 的 DDP 对用户进行身份验证的好信息。
这可能吗?如果是这样,最好的方法是什么?如何使用 SRP 远程登录 Meteor?
我目前正在使用直接节点(最终将使用 Express)以及此节点 ddp client。
要通过 DDP 登录,只需发送一个方法调用。您可以根据您想要登录的方式稍微更改它。
我将使用ddp-tools来尝试解释如何登录,因为它将与纯粹的 ddp 进行通信。以下示例中的登录详细信息是
用户名是user_1,密码是qwerty (是的,我知道它不好),电子邮件地址是email@email.com,登录令牌是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"}}'
使用令牌登录(登录时流星保存的内容:
ddp call 'login' '{"resume":"MxNY9BFPKra2uNWG7"}'
--
如果您不想像上述方式那样以纯文本形式发送密码,那么您没有使用 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 库。由于流星中有一个 SRP 库,因此很容易解释如何从每个库中获取密码,这非常棘手。如果你想用另一种语言写一个,你可以使用维基百科的解释来构建方法
所以我们开始一个 srp 交换(来自流星 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 库,但它们都是wikipedia上的 SRP 规范的一部分。Meteor 的 SRP 使用 SHA256 作为散列函数。
一个包现在正在执行登录部分,将 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) { ... })
我发现的最接近的是这个,但它在神秘的 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 中,所以您可能可以解除它:-)