Php 在同一项目Laravel 7中实现两个AuthController(web和api)时照亮\Auth\AuthenticationException

Php 在同一项目Laravel 7中实现两个AuthController(web和api)时照亮\Auth\AuthenticationException,php,laravel,Php,Laravel,我创建了一个Laravel应用程序。它可以通过web访问,用于管理员的web页面,以及用于用户页面的api。我使用Vue创建了用户页面,所以它需要API。 这样做,我需要两个身份验证控制器。一个是使用laravel脚手架为web自动创建的。另一个是手动创建的,供用户通过令牌登录。 我确实为API创建了AuthController。这是控制器 <?php namespace App\Http\Controllers\API; use App\Http\Controllers\Contr

我创建了一个Laravel应用程序。它可以通过web访问,用于管理员的web页面,以及用于用户页面的api。我使用Vue创建了用户页面,所以它需要API。 这样做,我需要两个身份验证控制器。一个是使用laravel脚手架为web自动创建的。另一个是手动创建的,供用户通过令牌登录。 我确实为API创建了AuthController。这是控制器

 <?php

namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use App\User;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{

    //untuk login
    public function login(Request $request)
    {
        //validasi data
        $this->validate($request, [
            'email' => 'email',
            'username' => 'string',
            'password' => 'required'
        ]);
        //login dapat menggunakan email atau username
        $user = User::where('email', '=', $request->email)
            ->orWhere('username', '=', $request->username)->first();
//        $username = User::where('username', $request->username)->first();
//        dd($username);
        $status = "error";
        $message = "";
        $data = null;
        $code = 401;
//        echo (gettype($email));
//        echo(gettype($username));
//        echo($email);
    if($user){
        if (Hash::check($request->password, $user->password)){
            $user->generateToken(); //generated 60 random string
            $status = 'success';
            $message = 'Login Success';
            //tampilkan data user menggunakan method to Array
            $data = $user->toArray();
            $code = 200;
        }
        else{
            $message = "Login gagal, password salah";
        }
    }
    else {
        $message = "Login gagal, username atau email salah";
    }

    return response()->json([
        'status' => $status,
        'message' => $message,
        'data' => $data,
    ], $code);
}

//untuk registrasi
public function register(Request $request)
{
    $validator = Validator::make($request->all(),
    [
        'name' => 'required|string|max:255',
        'email' => 'required|string|email|max:255|unique:users',
        'password' => 'required|string|min:6',
        'username' => 'string'
    ]);

    if ($validator->fails()){
        $errors = $validator->errors();
        return response()->json([
            'data' => [
                'message' => $errors,
            ]
        ],400);
    }
    else{
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'username' => $request->username,
            'roles' => json_encode(['CUSTOMER'])
        ]);

        if ($user){
            $user->generateToken();
            $status = "success";
            $message = "Register berhasil!";
            $data = $user->toArray();
            $code = 200;
        }
        else{
            $message = "Register gagal";
        }
        return response()->json([
            'status' => $status,
            'message' => $message,
            'data' => $data
        ], $code);
    }

}

//untuk logout
public function logout(Request $request)
{
    //get authenticated user data
    $user = Auth::user();
    if($user){
        $user->api_token = null; //delete user's token
        $user->save();
    }
    return response()->json([
        'status' => 'success',
        'message' => 'logout success,
        'data' => null,
    ], 200);
}
}
注销方法响应:

{
"status": "error",
"message": "Unauthenticated.",
"data": null,
"errors": {
    "exception": "Illuminate\\Auth\\AuthenticationException",
    "trace": [
        "#0 D:\\xampp\\htdocs\\book-store\\vendor\\laravel\\framework\\src\\Illuminate\\Auth\\Middleware\\Authenticate.php(68): Illuminate\\Auth\\Middleware\\Authenticate->unauthenticated(Object(Illuminate\\Http\\Request), Array)"
]
    }
}
谢谢你的时间和考虑

config\auth.php

 //Routing bersifat publik
Route::prefix('v1')->group(function (){
    Route::post('login', 'API\AuthController@login');
    Route::post('register', 'API\AuthController@register');
    Route::get('books', 'API\ApiBookController@index');
    Route::get('book/{id}', 'API\ApiBookController@view')
        ->where('id', '[0-9]+');
    Route::resource('categories', 'API\ApiCategoryController')
    ->except(['create', 'update']);

    //Routing bersifat private
    Route::middleware('auth:api')->group(function (){
        Route::post('logout', 'API\AuthController@logout');
    });
});
'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],
*注意:
config\auth.php
中的默认保护是
web
,因此我可以登录到web。

使用auth-guard

$user=Auth::guard('api')->user();


您必须在apiController中指定应该在控制器中注销的用户 你应该改变

$user = Auth::user();


然后注销他。

这个答案是最符合逻辑的方法,但我仍然会遇到同样的错误。你能在这里给出auth.phpi添加的auth.php吗@奥马尔_sharif@Vinotaz为什么不使用passport包来处理这个问题呢?我想先创建一个简单的包,以便学习purpose@Vinotaz在登录函数中,您根本不验证用户。只需为他生成令牌。@alirezadp10我之前已经给出了答案。.为什么需要添加相同的令牌answer@alirezadp10如何授权?
$user = Auth::guard('api')->user();;