php - Laravel 5.8 - 如何使用可选身份验证处理 API 路由?
问题描述
任何人都可以帮助我通过可选的身份验证检查来处理 API 路由吗?我有一个API ROUTE 'apply-coupon' 可供 'Guest' 和 'Logged In' 用户使用。如果用户已登录,我需要在控制器中获取用户 ID。
前端- 使用 React JS 开发,点击“应用优惠券”按钮,API 调用为 -
API end point - https://example.com/api/apply-coupon
Request payload - {coupon : 'my-coupon-code', shop_id : '1', subtotal : '150'}
注意:标头中没有传递令牌,因为访客用户也可以使用“应用优惠券”功能。
预期输出:-当用户点击“应用优惠券”时,如果用户 ID 登录,它应该返回用户 ID。
以下是我在api.php文件中的路线 -
Route::post('/apply-coupon', [
'uses' => 'CouponController@applyCoupon',
]);
更新:-默认守卫是-
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
我努力了
if(Auth::user()) {
dd(Auth::user());
}
和
auth()->guard('api')->user()
但没有任何效果。谢谢!!
解决方案
添加一个中间件ValidateUser.php
namespace App\Http\Middleware;
use Closure;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Facades\JWTAuth;
class ValidateUser
{
public function handle($request, Closure $next)
{
if (! $request->bearerToken()) {
return $next($request);
}
return $this->validateToken($request, $next);
}
private function validateToken($request, Closure $next)
{
try {
if (! JWTAuth::parseToken()->authenticate()) {
throw new \Exception('Unable to find the account');
}
} catch (TokenExpiredException $e) {
throw new \Exception('Token has been expired');
} catch (TokenInvalidException $e) {
throw new \Exception('Token is not valid');
} catch (JWTException $e) {
throw new \Exception('Unable to parse the token');
}
return $next($request);
}
}
在你的 http/kernel.php 中
$routeMiddleware
添加
'api.auth.validate' => \App\Http\Middleware\ValidateUser::class
现在在您的 api.php 中,您可以使用中间件来检查它,例如:
middleware(['api.auth.validate'])