gpt4 book ai didi

php - 如何在 API 注册中实现 Laravel 的必须验证电子邮件功能?

转载 作者:行者123 更新时间:2023-12-04 13:41:33 27 4
gpt4 key购买 nike

我在我的用户模型中实现了 MustVerifyEmail 接口(interface)

class User extends Authenticatable implements MustVerifyEmail

我也做了 VerificationApi Controller
<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Foundation\Auth\VerifiesEmails;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Auth\Events\Verified;

class VerificationApiController extends Controller
{
use VerifiesEmails;

* Mark the authenticated user’s email address as verified.

*

* @param \Illuminate\Http\Request $request

* @return \Illuminate\Http\Response

*/

public function verify(Request $request) {

$userID = $request['id'];

$user = User::findOrFail($userID);

$date = date("Y-m-d H:i:s");

$user->email_verified_at = $date; // to enable the “email_verified_at field of that user be a current time stamp by mimicing the must verify email feature

$user->save();

return response()->json('Email verified!');

}

/**

* Resend the email verification notification.

*

* @param \Illuminate\Http\Request $request

* @return \Illuminate\Http\Response

*/

public function resend(Request $request)

{

if ($request->user()->hasVerifiedEmail()) {

return response()->json('User already have verified email!', 422);

// return redirect($this->redirectPath());

}

$request->user()->sendEmailVerificationNotification();

return response()->json('The notification has been resubmitted');

}
}

我做了
<?php

namespace App\Notifications;

use Illuminate\Support\Carbon;

use Illuminate\Support\Facades\URL;

use Illuminate\Auth\Notifications\VerifyEmail as VerifyEmailBase;

class VerifyApiEmail extends VerifyEmailBase

{

/**

* Get the verification URL for the given notifiable.

*

* @param mixed $notifiable

* @return string

*/

protected function verificationUrl($notifiable)

{

return URL::temporarySignedRoute(

'verificationapi.verify', Carbon::now()->addMinutes(60), ['id' => $notifiable->getKey()]

); // this will basically mimic the email endpoint with get request

}

}

在我添加的 api.php 文件中
Route::get('email/verify/{id}', 'VerificationApiController@verify')->name('verificationapi.verify');

Route::get('email/resend', 'VerificationApiController@resend')->name('verificationapi.resend');

因此,当我注册到我的 api 时,我会在邮件陷阱中收到验证电子邮件,当我单击按钮时,它说我的电子邮件已通过验证,并且在我的数据库中,它从 null 更改为 email_verified_at 2019-05-27 13:04:20 但是当我将中间件('已验证')放在我的路线上,当我使用在 postman 中注册的用户登录时,我得到

"message": "Your email address is not verified.",
"exception": "Symfony\\Component\\HttpKernel\\Exception\\HttpException",

我的 register() 和 login() 函数如下所示:
 public function register(Request $request, User $user)
{
$phoneRegex = "(06|387)[0-9]{7,8}";
$request->validate([
'first_name' => 'required|string',
'last_name' => 'required|string',
'email' => 'required|string|email|unique:users',
'password' => 'required|string|confirmed',
'phone_number' => 'required|string|min:6',

]);
$user = new User([
'first_name' => $request->first_name,
'last_name' => $request->last_name,
'email' => $request->email,
'password' => bcrypt($request->password),
'phone_number' => $request['phone_number'],
]);
$user->save();

Auth::login($user,true);
$user->sendApiEmailVerificationNotification();

$success['message'] = 'Please confirm yourself by clicking on verify user button sent to you on your email';

return response()->json(['success'=>$success], $this->successStatus);
}
public function login(Request $request)
{
$request->request->add([
'client_id' => env("PASSPORT_CLIENT_ID"),
'client_secret' => env("PASSPORT_CLIENT_SECRET"),
'grant_type' => 'password',
'scope' => '',
]);
$tokenRequest = $request->create('/oauth/token', 'POST', $request->all());
$response = Route::dispatch($tokenRequest);

return $response;
}

有人可以帮我弄这个吗?

最佳答案

我通过执行以下操作解决了这个问题:

创建文件

Http > Middleware > EnsureEmailIsVerified.php

用这个代码
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Contracts\Auth\Factory as Auth;

class EnsureEmailIsVerified
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;

/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $redirectToRoute
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle($request, Closure $next, $guard = null)
{
if (! $request->user($guard)) {
if($request->expectsJson()) {
return response()->json([
'message' => 'You do not have permission to access this feature.',
'errors' => [
'main' => ['The access token is either missing or incorrect.']
]
], 401);
} else {
return redirect(route('login'));
}
} else if
($request->user($guard) instanceof MustVerifyEmail &&
! $request->user($guard)->hasVerifiedEmail()) {

if($request->expectsJson()) {
return response()->json([
'message' => 'You do not have permission to access this feature.',
'errors' => [
'main' => ['Your email address is not verified.']
]
], 403);
} else {
return redirect(route('verification.notice'));
}
}

$this->auth->shouldUse($guard);

return $next($request);
}
}

在 Kernel.php 文件中,更改“已验证”的值
protected $routeMiddleware = [
...
'verified' => \App\Http\Middleware\EnsureEmailIsVerified::class,
]

在routes > api.php 文件中使用verified:api
Route::group(['middleware' => 'verified:api'], function () {
Route::get('/user', function (Request $request) {
return $request->user();
});
});

这对我很有效,因为我可以为我的 API 和网站使用相同的中间件,同时仍然尽可能通用。

关于php - 如何在 API 注册中实现 Laravel 的必须验证电子邮件功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374720/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com