带有React和React路由器的Meteor的Accounts.onEmailVerificationLink

时间:2016-04-18 05:13:48

标签: javascript meteor reactjs react-router meteor-accounts

我正在尝试使用Meteor的帐户密码包让React / Meteor使用电子邮件验证。我正在使用React Router。我不确定放在哪里/怎么称呼它:

Accounts.onEmailVerificationLink(function(token, done) {
 Accounts.verifyEmail(token);
});

我有一个注册组件和容器,我正在尝试将验证电子邮件链接到登录组件/容器并进行验证。我在Meteor中完成了以下操作。(isServer)Meteor.startup块:

Accounts.urls.verifyEmail = function(){
 return Meteor.absoluteUrl("restaurantsignin");
};

我的反应路由器文件如下所示:

Meteor.startup(() => {
  render(
    <Router history={browserHistory}>
      <Route path="/" component={App}>
        <IndexRoute component={Home} />
        <Route path="/about" component={About} />
        <Route path="/restaurantsignin" component={RestaurantSignInContainer} />
        <Route path="/restaurantsignup" component={RestaurantSignUpContainer} />
        <Route path="/customersignup" component={CustomerSignUpContainer} />
        <Route path="/restaurantresetemail" component={RestaurantResetEmailContainer} />
        <Route path="/restaurantresetpassword" component={RestaurantResetPasswordContainer} />

        <Route path="/restaurant/:restaurantName" component={MenuPage} />
      </Route>
    </Router>, document.getElementById('app')
  );

});

我的反应组件文件如下所示:

import React from 'react';
import Radium from 'radium';
import ReactDOM from 'react-dom';
import { Alert, Button } from 'react-bootstrap';

export default class RestaurantSignIn extends React.Component {

  handleAlertVerifiedDismiss() {
    document.getElementById('alert_verified_box').style.display = 'none';
  }

  render() {
    var styles = {
.
.
.
  return (
    <div style={styles.signInContainer}>
. 
.
.
and so on

电子邮件验证链接正在成功发送,并正确地重定向到/ restaurantsignin链接。我只是不确定如何在用户到达登录页面时对其进行正确验证 - 我希望在用户登录之前对其进行验证(一旦他们点击链接) - 流星docs说使用上面的帐户代码片段但除此之外,我还没有在网上找到任何东西。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:3)

Accounts.urls.verifyEmail函数接受一个token参数,因此您可以执行以下操作:

Accounts.urls.verifyEmail = function(token) {
  return Meteor.absoluteUrl("restaurantsignin?token="+token)
}

然后,用户点击电子邮件中的标记,该标记已经在查询参数中,您可以使用this.props.location.query.token提取该标记。因此,在您的RestaurantSignIn组件componentWillMount中,您可以致电:

Accounts.verifyEmail(this.props.location.query.token, function(error) {...})

如果没有错误,您可以使用this.props.history.replace('/dashboard')直接导航到经过身份验证的路由,因为Accounts.verifEmail()会自动将用户登录。