使用meteor,我希望能够在他们使用外部服务登录(身份验证)以获取授权声明后扩充user
记录。
更新我正在使用{{loginButtons}}
车把辅助小部件。
目前,我看到一个Accounts.validateNewUser
和一个Accounts.onCreateUser
,可以在创建新用户期间挂钩。这些最初会有所帮助,但我的需求是反复出现的。
我知道有一个allow
函数挂在Meteor.Collection
上,作为授权用户访问集合的一种手段 - 这正是我将使用我打算增强用户的claims
来确定授权的地方。
有谁知道在登录过程中有一个钩子可以让我这样做?
解决缺少回调的最简单方法是使用相关的反应变量:
Tracker.autorun(function() {
if (Meteor.userId()) {
// do something when they've just logged in.
}
});
autorun
设置的上下文只会在Meteor.userId()
的值发生变化时(即登录时)重新运行。
从 Meteor 0.7.2 版本开始,有一个服务器端钩子可用: Accounts.onLogin()
从使用密码登录的 Meteor 文档中,似乎已经有一个回调用于您需要做的事情:
Meteor.loginWithPassword(user, password, [callback])
回调函数 可选回调。调用时没有参数 成功,或在失败时使用单个 Error 参数。
Meteor 和外部身份验证服务都支持登录回调。
@Makita,谢谢你的回答。我确实看到了callback
参数,但我在问题中没有提到的是我没有低级钩子,因为我正在使用{{loginButtons}}
车把助手来注入用户管理小部件(这太棒了)。
这种方法的问题在于,在身份验证发生后我无法访问回调,因此我创建了此拉取请求,我希望将其合并以解决问题:
https://github.com/meteor/meteor/pull/479
有了这个,您应该能够调用:
Accounts.ui.config({
onSuccess: function (err) {
//perform addl authorization on Meteor.user() here
}
});
对于 2014 年来到这里的人, 您可以使用 onLogin 回调服务器端
Accounts.onLogin((obj)->user = ob.user )
对于接受的答案,页面重新加载时存在一个问题,导致该解决方案混乱。我最终做了这样的事情(它使用角流星,但你应该得到要点,只需用自动运行代替跟踪器)
.run(function($meteor,$rootScope,$state,$localstorage){
$meteor.autorun($rootScope, function(){
var id = Meteor.userId();
if(id == undefined || id == null){
id = '';
}
if($localstorage.get('user_id','') != id){
$localstorage.set('user_id',id);
if(Meteor.userId()){
//On login
$state.go('profile',{user_id: Meteor.userId()});
}else{
//On logout
$state.go('main');
}
}
});
});
我只推荐这个解决方案进行开发,当我停止使用默认的 accounts-ui 时,我将不得不实现较低级别的函数,并且不需要这样做。