【问题标题】:Laravel - auth()->refresh() is undefined in JWT AuthController?Laravel - auth()->refresh() 在 JWT AuthController 中未定义?
【发布时间】:2020-08-05 10:58:32
【问题描述】:

我正在创建一个 Laravel + Angular 应用程序,并且我使用 JWT。 (我按照教程进行操作,但中间出现错误)。

我已经有一个 Laravel 和 Angular 项目,当我创建 laravel 项目时我没有指定任何身份验证(我什至删除了用户迁移)。

由于它们是现有项目,我不想重新开始。 我运行了以下命令以在我的 Angular 项目中使用 JWT:

composer require tymon/jwt-auth:dev-develop --prefer-source
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret

之后我将默认路由器复制到 api.php:

Route::post('login', 'ApiController@login');
Route::post('register', 'ApiController@register');

Route::group(['middleware' => 'auth.jwt'], function () {
    Route::get('logout', 'ApiController@logout');
    Route::get('user', 'ApiController@getAuthUser');

});

并扩展现有的User.php:

class User extends Authenticatable implements JWTSubject

我将必填字段复制到 config/auth.php 中。

在下一步中,我必须将其复制到 AuthController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

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()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        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
        ]);
    }
}

在公共函数 refresh() 方法中,它给了我以下错误: “未定义的方法‘刷新’。intelephense(1013)” (工厂也一样)

为什么它们未定义?我必须在课堂上加入一些东西吗?

【问题讨论】:

    标签: angular laravel authentication jwt token


    【解决方案1】:

    似乎没有正确注册 auth guard。我会通过检查 AuthGuard 是否真的在包的src/Providers/AbstractServiceProvider::extendAuthGuard 中扩展来开始调试。

    【讨论】:

    • 在app/Providers中,我只有AuthServiceProvider和AppServiceProvider,没有AbstractServiceProvider
    • 我应该更清楚。文件的整个路径类似于./vendor/tymon/jwt-auth/src/Providers/AbstractServiceProvider.php
    • 我刚刚注意到我没有看到您的控制器中的 register 方法的路由。你有吗?如果有,是否在 'auth.jwt' 中间件路由组内?
    • 我找到了 AbstractServiceProvider.php,并在其中找到了这个:“protected $middlewareAliases = [ 'jwt.auth' => Authenticate::class, 'jwt.check' => Check::类, 'jwt.refresh' => RefreshToken::class, 'jwt.renew' => AuthenticateAndRenew::class, ];"
    • 对于您的第二个答案:如果您在谈论 AuthController.php 中的注册方法,我没有。我是从“jwt-auth.readthedocs.io/en/develop/quick-start/…”复制过来的,没有注册方法。
    【解决方案2】:

    当您使用 auth() 而不指定任何参数时,它会使用您的 config/auth.php 文件中的默认身份验证防护,您可能没有将其替换为您的 JWT 防护。

    【讨论】:

    • 我做了,这个:'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], ... 'guards' => [ 'api ' => [ '司机' => 'jwt', '提供者' => '用户', ], ],
    猜你喜欢
    • 2021-06-19
    • 2017-07-29
    • 2016-01-06
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2021-07-04
    • 2019-05-22
    相关资源
    最近更新 更多