我想就通过电子邮件激活用户的最有效方式提出一些建议。当用户注册时,我想要创建一个激活码,该激活码将在电子邮件中发送,表示他们需要激活,(激活码作为域url发送,令牌作为参数)。但是,我不确定处理这个问题的最佳数据库结构是什么......
我认为,简单的选项是在activation_token
表格中设置activated
和users
列,并且当匹配用户和activation_token
的网址为命中,activated
将成为真/!0。虽然很简单,但我希望在users表上尽可能多地节省空间。
或者,我可以制作一个包含activation
的{{1}}表格,并在user_id, token, activated
和users
之间建立一对一的关系。在activation
模型中有:
User
同样,当用户点击带有token参数的url时,将public function activation() {
return $this->hasOne('App\Activation');
}
public function activated() {
return $this->activation->activated != 0 ? true:false;
}
更改为1 / true。
激活链接和注册确认被推送到一个队列,所以我并不过分担心用户可以被激活的速度,而是更多关注用户认证用户所需的额外时间长度。附加参数必备。
我确信可能有更好的方法可以做到这一点,但在谷歌用户激活laravel 5.3后,结果通常是过时的方法和laravel版本的过时包或教程。除此之外,可用的包装不是特别轻巧,并且有许多配置设置,我根本不需要,因此我不想要因为当我自己可以做到这一点时,我没有看到堵塞的重点。我也不愿意通过其他人的包裹进行搜索并删除不必要的批量(根据我的需要)。
那么,任何人都可以建议一个更好的选择,或者可能支持上述一个想法吗?
答案 0 :(得分:0)
您可以使用在用户的电子邮件上发送激活链接的技术来激活一个人的帐户。答案可能会很长,但我会尽量缩短答案:
用户架构如下所示:
users
- id
- name
- email
- is_email_activated
- activation_token
控制器将是这样的(在创建用户帐户时):
class UsersController {
function create() {
$user = User::create(request()->all());
$activation_token = $this->encryptData($user->id);
$activation_link = route('verify_token', ['token' => $activation_token]);
$user->activation_token = $activation_token;
$user->save();
// Send mail to user with activation link...
}
function encryptData($id, $delimiter='|', $expiry = 1) {
$data[] = $id;
$data[] = rand(0,999999);
$data[] = time(); // This param can help us to retrieve the token generation time at the time of verification
$key = implode($delimiter, $data);
$key = Crypt::encrypt($key);
return $key;
}
}
现在发送到用户电子邮件的链接应指向路线:
Route::get('users/activation/{token}', UsersController@verifyToken)->name('verify_token');
验证方法如下所示:
class UsersController {
function verifyToken($key) {
$key = Crypt::decrypt($key);
$data = explode("|", $key);
$data['id'] = $data[0];
$data['previous_time'] = $data[2];
$data['success'] = true;
$user = User::find($data['id'])
// Token valid if user is found and token is valid for only 24 Hrs Check (not mandatory in case of email activation, you should use this in case of resetting user's password)
if($user && (time() - ($data['previous_time'] <= 86400))) {
// User validated and make is_email_activated column to true / 1
}
}
}
希望这有帮助!