mirror of
https://github.com/v2board/v2board.git
synced 2025-01-10 16:19:10 +08:00
update: add login with mail link api
This commit is contained in:
parent
2b4e8f4b88
commit
bdb10bed32
@ -2,15 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Console\Commands;
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
use App\Models\Order;
|
|
||||||
use App\Models\User;
|
|
||||||
use App\Utils\CacheKey;
|
|
||||||
use App\Utils\Helper;
|
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
use Illuminate\Filesystem\Filesystem;
|
|
||||||
use Illuminate\Foundation\Console\ConfigCacheCommand;
|
|
||||||
use Illuminate\Support\Facades\Cache;
|
|
||||||
use Matriphe\Larinfo;
|
|
||||||
|
|
||||||
class Test extends Command
|
class Test extends Command
|
||||||
{
|
{
|
||||||
|
@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
|
|||||||
use App\Http\Requests\Passport\AuthRegister;
|
use App\Http\Requests\Passport\AuthRegister;
|
||||||
use App\Http\Requests\Passport\AuthForget;
|
use App\Http\Requests\Passport\AuthForget;
|
||||||
use App\Http\Requests\Passport\AuthLogin;
|
use App\Http\Requests\Passport\AuthLogin;
|
||||||
|
use App\Jobs\SendEmailJob;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use App\Models\Plan;
|
use App\Models\Plan;
|
||||||
@ -18,6 +19,59 @@ use ReCaptcha\ReCaptcha;
|
|||||||
|
|
||||||
class AuthController extends Controller
|
class AuthController extends Controller
|
||||||
{
|
{
|
||||||
|
public function loginWithMailLink(Request $request)
|
||||||
|
{
|
||||||
|
if (!(int)config('v2board.login_with_mail_link_enable')) {
|
||||||
|
abort(404);
|
||||||
|
}
|
||||||
|
$params = $request->validate([
|
||||||
|
'email' => 'required|email',
|
||||||
|
'redirect' => 'nullable'
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (Cache::get(CacheKey::get('LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP', $params['email']))) {
|
||||||
|
abort(500, __('Sending frequently, please try again later'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::where('email', $params['email'])->first();
|
||||||
|
if (!$user) {
|
||||||
|
return response([
|
||||||
|
'data' => true
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$code = Helper::guid();
|
||||||
|
$key = CacheKey::get('TEMP_TOKEN', $code);
|
||||||
|
Cache::put($key, $user->id, 300);
|
||||||
|
Cache::put(CacheKey::get('LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP', $params['email']), time(), 60);
|
||||||
|
|
||||||
|
|
||||||
|
$redirect = '/#/login?verify=' . $code . '&redirect=' . ($request->input('redirect') ? $request->input('redirect') : 'dashboard');
|
||||||
|
if (config('v2board.app_url')) {
|
||||||
|
$link = config('v2board.app_url') . $redirect;
|
||||||
|
} else {
|
||||||
|
$link = url($redirect);
|
||||||
|
}
|
||||||
|
|
||||||
|
SendEmailJob::dispatch([
|
||||||
|
'email' => $user->email,
|
||||||
|
'subject' => __('Login to :name', [
|
||||||
|
'name' => config('v2board.app_name', 'V2Board')
|
||||||
|
]),
|
||||||
|
'template_name' => 'login',
|
||||||
|
'template_value' => [
|
||||||
|
'name' => config('v2board.app_name', 'V2Board'),
|
||||||
|
'link' => $link,
|
||||||
|
'url' => config('v2board.app_url')
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response([
|
||||||
|
'data' => $link
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function register(AuthRegister $request)
|
public function register(AuthRegister $request)
|
||||||
{
|
{
|
||||||
if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
|
if ((int)config('v2board.register_limit_by_ip_enable', 0)) {
|
||||||
|
@ -18,6 +18,7 @@ class PassportRoute
|
|||||||
$router->post('/auth/forget', 'Passport\\AuthController@forget');
|
$router->post('/auth/forget', 'Passport\\AuthController@forget');
|
||||||
$router->post('/auth/getTempToken', 'Passport\\AuthController@getTempToken');
|
$router->post('/auth/getTempToken', 'Passport\\AuthController@getTempToken');
|
||||||
$router->post('/auth/getQuickLoginUrl', 'Passport\\AuthController@getQuickLoginUrl');
|
$router->post('/auth/getQuickLoginUrl', 'Passport\\AuthController@getQuickLoginUrl');
|
||||||
|
$router->post('/auth/loginWithMailLink', 'Passport\\AuthController@loginWithMailLink');
|
||||||
// Comm
|
// Comm
|
||||||
$router->get ('/comm/config', 'Passport\\CommController@config');
|
$router->get ('/comm/config', 'Passport\\CommController@config');
|
||||||
$router->post('/comm/sendEmailVerify', 'Passport\\CommController@sendEmailVerify');
|
$router->post('/comm/sendEmailVerify', 'Passport\\CommController@sendEmailVerify');
|
||||||
|
@ -19,7 +19,8 @@ class CacheKey
|
|||||||
'TEMP_TOKEN' => '临时令牌',
|
'TEMP_TOKEN' => '临时令牌',
|
||||||
'LAST_SEND_EMAIL_REMIND_TRAFFIC' => '最后发送流量邮件提醒',
|
'LAST_SEND_EMAIL_REMIND_TRAFFIC' => '最后发送流量邮件提醒',
|
||||||
'SCHEDULE_LAST_CHECK_AT' => '计划任务最后检查时间',
|
'SCHEDULE_LAST_CHECK_AT' => '计划任务最后检查时间',
|
||||||
'REGISTER_IP_RATE_LIMIT' => '注册频率限制'
|
'REGISTER_IP_RATE_LIMIT' => '注册频率限制',
|
||||||
|
'LAST_SEND_LOGIN_WITH_MAIL_LINK_TIMESTAMP' => '最后一次发送登入链接时间'
|
||||||
];
|
];
|
||||||
|
|
||||||
public static function get(string $key, $uniqueValue)
|
public static function get(string $key, $uniqueValue)
|
||||||
|
@ -90,5 +90,7 @@
|
|||||||
"Request failed, please try again later": "Request failed, please try again later",
|
"Request failed, please try again later": "Request failed, please try again later",
|
||||||
"Register frequently, please try again after 1 hour": "Register frequently, please try again after 1 hour",
|
"Register frequently, please try again after 1 hour": "Register frequently, please try again after 1 hour",
|
||||||
"Uh-oh, we've had some problems, we're working on it.": "Uh-oh, we've had some problems, we're working on it",
|
"Uh-oh, we've had some problems, we're working on it.": "Uh-oh, we've had some problems, we're working on it",
|
||||||
"This subscription reset package does not apply to your subscription": "This subscription reset package does not apply to your subscription"
|
"This subscription reset package does not apply to your subscription": "This subscription reset package does not apply to your subscription",
|
||||||
|
"Login to :name": "Login to :name",
|
||||||
|
"Sending frequently, please try again later": "Sending frequently, please try again later"
|
||||||
}
|
}
|
||||||
|
@ -90,5 +90,7 @@
|
|||||||
"Request failed, please try again later": "请求失败,请稍后再试",
|
"Request failed, please try again later": "请求失败,请稍后再试",
|
||||||
"Register frequently, please try again after 1 hour": "注册频繁,请等待1小时后再次尝试",
|
"Register frequently, please try again after 1 hour": "注册频繁,请等待1小时后再次尝试",
|
||||||
"Uh-oh, we've had some problems, we're working on it.": "遇到了些问题,我们正在进行处理",
|
"Uh-oh, we've had some problems, we're working on it.": "遇到了些问题,我们正在进行处理",
|
||||||
"This subscription reset package does not apply to your subscription": "该订阅重置包不适用于你的订阅"
|
"This subscription reset package does not apply to your subscription": "该订阅重置包不适用于你的订阅",
|
||||||
|
"Login to :name": "登入到 :name",
|
||||||
|
"Sending frequently, please try again later": "发送频繁,请稍后再试"
|
||||||
}
|
}
|
||||||
|
195
resources/views/mail/classic/login.blade.php
Normal file
195
resources/views/mail/classic/login.blade.php
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>邮箱验证码</title>
|
||||||
|
<style type="text/css">
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-webkit-text-size-adjust: none;
|
||||||
|
width: 100% !important;
|
||||||
|
height: 100%;
|
||||||
|
line-height: 1.6em;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: #f6f6f6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media only screen and (max-width: 640px) {
|
||||||
|
body {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: 800 !important;
|
||||||
|
margin: 20px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-weight: 800 !important;
|
||||||
|
margin: 20px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-weight: 800 !important;
|
||||||
|
margin: 20px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-weight: 800 !important;
|
||||||
|
margin: 20px 0 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 22px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 18px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
padding: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content-wrap {
|
||||||
|
padding: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.invoice {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body itemscope itemtype="http://schema.org/EmailMessage"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; line-height: 1.6em; background-color: #f6f6f6; margin: 0;"
|
||||||
|
bgcolor="#f6f6f6">
|
||||||
|
<table class="body-wrap"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;"
|
||||||
|
bgcolor="#f6f6f6">
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"
|
||||||
|
valign="top">
|
||||||
|
</td>
|
||||||
|
<td class="container" width="600"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; margin: 0 auto;"
|
||||||
|
valign="top">
|
||||||
|
<div class="content"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 20px;">
|
||||||
|
<table class="main" width="100%" cellpadding="0" cellspacing="0"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;"
|
||||||
|
bgcolor="#fff">
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="alert alert-warning"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 22px; font-weight: bold; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #0073ba; margin: 0; padding: 20px;"
|
||||||
|
align="center" bgcolor="#0073ba" valign="top">
|
||||||
|
{{$name}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-wrap"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 20px;"
|
||||||
|
valign="top">
|
||||||
|
<table width="100%" cellpadding="0" cellspacing="0"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 34px; vertical-align: top; line-height: 1em; margin: 0; padding: 20px 0 30px;"
|
||||||
|
valign="top">
|
||||||
|
Dear Customer
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 16px; color: #4a4a4a; vertical-align: top; margin: 0; padding: 0 0 20px;"
|
||||||
|
valign="top">
|
||||||
|
您正在登入到{{$name}}, 请在 5 分钟内点击下方链接进行登入。如果您未授权该登入请求,请无视。
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 36px; font-weight: bold; text-align: center; color: #4a4a4a; vertical-align: top; line-height: 1.6em; margin: 0; padding: 0 0 20px;"
|
||||||
|
valign="top">
|
||||||
|
<a href="{{$link}}">{{$link}}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #757575; vertical-align: top; margin: 0; padding: 0 0 20px;"
|
||||||
|
valign="top">
|
||||||
|
(本邮件由系统自动发出,请勿直接回复)
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; text-align: center; vertical-align: top; margin: 0; padding: 0 0 20px;"
|
||||||
|
valign="top">
|
||||||
|
<a href="{{$url}}"
|
||||||
|
class="btn-primary"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; color: #fff; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #0073ba; margin: 0; border-color: #0073ba; border-style: solid; border-width: 8px 20px;">登录 {{$name}}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div class="footer"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
|
||||||
|
<table width="100%"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="aligncenter content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0;"
|
||||||
|
align="center" valign="top">
|
||||||
|
© {{$name}}. All Rights Reserved.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
|
||||||
|
<td class="aligncenter content-block"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; color: #999; text-align: center; margin: 0; padding: 0 0 20px;"
|
||||||
|
align="center" valign="top">
|
||||||
|
<a href="{{$url}}/#/subscribe"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: none; margin: 0;">我的订阅</a> |
|
||||||
|
<a href="{{$url}}/#/knowledge"
|
||||||
|
style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: none; margin: 0;">使用教程</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td style="font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;"
|
||||||
|
valign="top">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
43
resources/views/mail/default/login.blade.php
Normal file
43
resources/views/mail/default/login.blade.php
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
<div style="background: #eee">
|
||||||
|
<table width="600" border="0" align="center" cellpadding="0" cellspacing="0">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div style="background:#fff">
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td valign="middle" style="padding-left:30px;background-color:#415A94;color:#fff;padding:20px 40px;font-size: 21px;">{{$name}}</td>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr style="padding:40px 40px 0 40px;display:table-cell">
|
||||||
|
<td style="font-size:24px;line-height:1.5;color:#000;margin-top:40px">登入到{{$name}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="font-size:14px;color:#333;padding:24px 40px 0 40px">
|
||||||
|
尊敬的用户您好!
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
您正在登入到{{$name}}, 请在 5 分钟内点击下方链接进行登入。如果您未授权该登入请求,请无视。
|
||||||
|
<a href="{{$link}}">{{$link}}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr style="padding:40px;display:table-cell">
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="padding:20px 40px;font-size:12px;color:#999;line-height:20px;background:#f7f7f7"><a href="{{$url}}" style="font-size:14px;color:#929292">返回{{$name}}</a></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
Loading…
Reference in New Issue
Block a user