2017-03-08 190 views
1

我有一个流星应用程序,我使用nginx与内部SSO服务进行身份验证。我能够成功地完成这项工作,并在服务器Meteor.onConnection方法的nginx set http标题中检索用户详细信息。流星 - 自动发起客户端登录

在这一点上,我不知道什么是最好的方法是访问客户端的用户细节。我觉得我应该使用内置的流星帐户,但我不知道如何从客户端启动登录过程,因为用户实际上不会通过Meteor客户端登录,而是通过通过nginx发生的重定向登录。我觉得我需要一种方法来自动启动流星端的登录过程,以适当地设置meteor.users集合,但我无法想出一个办法来做到这一点。

回答

1

结帐答案here。您可以通过nginx将userId(或任何想要传递用户的内容)传递给服务器,然后传递到客户端以进行登录。您可以在Webapp.connectHandler中生成并插入令牌。

import { Inject } from 'meteor/meteorhacks:inject-initial'; 
// server/main.js 
Meteor.startup(() => { 
    WebApp.connectHandlers.use("/login",function(req, res, next) { 
     Fiber(function() { 
     var userId = req.headers["user-id"] 
     if (userId){ 
      var stampedLoginToken = Accounts._generateStampedLoginToken(); 
      //check if user exists 
      Accounts._insertLoginToken(userId, stampedLoginToken); 
      Inject.obj('auth', { 
      'loginToken':stampedLoginToken 
      },res);    
      return next() 
     } 
     }).run() 
    })  
} 

现在你可以用的meteor-inject-initial package

import { Inject } from 'meteor/meteorhacks:inject-initial'; 
// iron router 
Router.route('/login', { 
    action: function() { 
     if (!Meteor.userId()){ 
      Meteor.loginWithToken(Inject.getObj('auth').loginToken.token, 
       function(err,res){ 
        if (err){ 
         console.log(err) 
        } 
       } 
      ) 
     } else { 
      Router.go('/home') 
     } 
    }, 
}); 
+0

哪里,我会添加客户端代码,以便它时,将触发新的用户点击应用程序的帮助下在客户端登录? –

+0

你可以在'Meteor.startup(...)'中的client/main.js中或在lib/router这样的导入共享文件中的if(Meteor.isClient()){...}中执行。 js或'Router.config'的'waitOn'如果你正在使用Iron Router ... – mutdmour

+0

你也可以在'/ login'路由的'waitOn'或'action'中做如果你有这个路由,因为这是路由这在我的例子中被调用(如果你正在使用铁路路由器) – mutdmour