Laravel6 在使用 jwt 认证,最后生成 token 的时候报错

公司要求做一个新项目,只有我一个后端,刚开始撸laravel,一直没用过,碰到很多问题,说说这个jwt多用户认证吧,被卡住了,根据这两个老哥的文章做的jwt多用户认证,用的是laravel6版本

Laravel jwt 多表(多用户端)验证隔离
Laravel JWT 多表多用户登录

问题

根据前面的步骤一步一步来了,但是到了最后,却碰到一个找不到答案的报错,实在无奈了,求助老哥,这个报错该怎么解决,不胜感激
报错:
BadMethodCallException
Method Illuminate\Auth\SessionGuard::factory does not exist.

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Tymon\JWTAuth\Facades\JWTAuth;
use Illuminate\Support\Facades\Validator;
class AuthController extends Controller
{
    /**
     * Create a new AuthController instance.
     *
     * @return void
     */
    public function __construct()
    {
       $this->middleware('auth:api', ['except' => ['login']]);
    }

    /**
     * Get a JWT via given credentials.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth('api')->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }
        // 在这里的时候报错了,Method Illuminate\Auth\SessionGuard::factory does not exist.
        return $this->respondWithToken( $token );
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function me()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

        return response()->json(['message' => 'Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}
马江川@13753441707
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 15

auth.php 没配置好,,,

defaults 中的 guard 指定为一个 driverjwtguard,,,

4年前 评论

file

不是使用默认的就可以吗?

4年前 评论
largezhou 4年前
mjc123456 (作者) (楼主) 4年前

@largezhou 老哥你说的是这个配置吗

 'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'hash' => false,
        ],
        'admin' => [
            'driver' => 'jwt',
            'provider' => 'admin',
        ]
4年前 评论
largezhou 4年前
mjc123456 (作者) (楼主) 4年前

上面的认证已经过了,返回true,但是在最后生成token的时候,报了这个错,老哥

return $this->respondWithToken( $token );
4年前 评论
AloneUtopia

你的respondWithToken()方法中 'expires_in' => auth()->factory()->getTTL() * 60 使用的是默认守卫,没有指定使用driverjwt的守卫。

protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }

改为你使用了jwt的守卫即可, 如api, 'expires_in' => auth('api')->factory()->getTTL() * 60

4年前 评论
Jennie

登录用的 auth('api') ,所以你试试在 respondWithToken 这个方法里的 auth 也是用 api 这个守卫。

4年前 评论
mjc123456 (楼主) 4年前

最后怎么解决的? 求解

2年前 评论
mjc123456 (楼主) 2年前
return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->guard('api')->factory()->getTTL() * 60,
            'user' => auth()->guard('api')->user()
        ]);

變成只要乎要auth後面都要指定guard為api

@会飞的蜗牛

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!