如何在服务器端路由上检查是否记录了用户?
我会在'之前'添加检查,但是Metor.user()在这里不起作用。
提前感谢。
P.S。我找到了How to get Meteor.user() to return on the server side?,但没有找到铁路由器
答案 0 :(得分:8)
我担心这是不可能的。我想这个问题来自于你试图用两种不同的协议连接到服务器 - 从字面上和逻辑上 - 所以没有明显的方法来联系这两个行为。
但是,有一个非常简单的解决方案可以满足您的需求。您需要开发一个简单的特权令牌系统,或秘密密钥,或任何您称之为的密钥。首先,创建一个服务器方法
var Secrets = new Meteor.Collection("secrets"); // only on server!!!
Meteor.methods({
getSecretKey: function () {
if (!this.userId)
// check if the user has privileges
throw Meteor.Error(403);
return Secrets.insert({_id: Random.id(), user: this.userId});
},
});
然后,您现在可以在客户端上使用它来获取附加到secretKey
请求(或其他内容)的AJAX
,HTTP
标头内或{{ 1}}本身。不要害怕!
如果您使用的是URL
,则会对所有内容进行加密。
在服务器端,您现在可以从传入请求中检索HTTPS
,并检查它是否存在于secretKey
集合中。您将知道用户是否被授予某些特权。
此外,出于安全原因,您可能需要在一段时间后从集合中删除您的密钥。
答案 1 :(得分:3)
如果您要做的是验证发出请求的Meteor.user,我目前正在IronRouter.route()的上下文中执行此操作。必须在标头中使用有效的用户ID和身份验证令牌进行请求。我在Router.route()中调用此函数,然后让我访问this.user:
###
Verify the request is being made by an actively logged in user
@context: IronRouter.Router.route()
###
authenticate = ->
# Get the auth info from header
userId = this.request.headers['x-user-id']
loginToken = this.request.headers['x-auth-token']
# Get the user from the database
if userId and loginToken
user = Meteor.users.findOne {'_id': userId, 'services.resume.loginTokens.token': loginToken}
# Return an error if the login token does not match any belonging to the user
if not user
respond.call this, {success: false, message: "You must be logged in to do this."}, 401
# Attach the user to the context so they can be accessed at this.user within route
this.user = user
###
Respond to an HTTP request
@context: IronRouter.Router.route()
###
respond = (body, statusCode=200, headers={'Content-Type':'text/json'}) ->
this.response.writeHead statusCode, headers
this.response.write(JSON.stringify(body))
this.response.end()
这段代码深受RestStop和RestStop2的启发。它是在Meteor 0.9.0+(构建在Iron Router之上)编写REST API的流星包的一部分。您可以在这里查看完整的源代码: