首页 > 解决方案 > 如何在 API 身份验证中只允许不记名令牌?

问题描述

使用 $this->middleware('auth:auth') 时,用户令牌可以作为查询字符串、请求负载或承载令牌传递:https ://laravel.com/docs/5.8/api-authentication#passing-tokens-请求中

我只想允许通过不记名令牌进行身份验证。这意味着我不想允许通过查询字符串或发布请求进行身份验证。

我试图通过添加一个仅删除 api_token 的中间件来解决它

public function handle($request, Closure $next)
{
    $request->request->set('api_token', null);
    return $next($request);
}

但不管我做什么

Route::group(['middleware' => ['auth:api', 'remove-api-token'],

或者

Route::group(['middleware' => ['remove-api-token', 'auth:api'],

总会auth:api先触发。所以我的方法行不通。

任何想法如何auth:api仅拒绝 GET/POST 身份验证?

标签: laravel-5

解决方案


一种选择是扩展现有的tokenGuard并覆盖getTokenForRequest ()方法以仅接受不记名令牌:

创建一个新的守卫:

“app\Services\Auth\BearerTokenGuard.php”

<?php

namespace App\Services\Auth;

use Illuminate\Auth\TokenGuard;

class BearerTokenGuard extends TokenGuard
{
    /**
     * Get the token for the current request.
     *
     * @return string
     */
    public function getTokenForRequest()
    {
        return $this->request->bearerToken();
    }
}

在服务提供商中定义新的 Guard:

“app\Providers\AuthServiceProvider.php”

use App\Services\Auth\BearerTokenGuard;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    Auth::extend('bearerToken', function ($app, $name, array $config) {
        return new BearerTokenGuard(Auth::createUserProvider($config['provider']), $app['request']);
    });
}

将新的警卫驱动程序添加到警卫配置中:

“配置\auth.php”

'guards' => [
    'api' => [
        'driver' => 'bearerToken',
        'provider' => 'users',
        'hash' => false,
    ],
],

我没有对此进行测试,但它应该可以工作,尽管它可能需要一些修改。


推荐阅读