Что Laravel маркер промежуточного


Я хочу, чтобы мои API недоступен для всех клиентов, которые не имеют маркера доступа. Это означает, что Android-приложение будет отправить client как Android и token в качестве маркера строку в заголовке с ключами client и token.

Сейчас на middleware, я проверяю его с моих полей таблицы, чтобы пройти авторизацию. Если оба подходят, то я разрешаю, а если нет, то сразу вышлем ответ 403.

Я осознаю паспорт, но это не то, что я ищу. В самом деле, рассматривать его в качестве первого слоя защиты, а затем использовать паспорт в качестве второго уровня защиты для авторизации в API.

Этот код правильный?

Поскольку я не очень знаком с Laravel - по промежуточного слоя я просто хочу получить обратную связь от экспертов, является ли код, который я написал, является точной и соответствует стандартам. Если нет, буду признателен за ваше предложение и помощь, чтобы сделать его лучше.

Промежуточное

namespace App\Http\Middleware;

use App\ApiToken;
use Closure;
use function response;

class ApiAccess
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     *
     * @return mixed
     */
    public function handle( $request, Closure $next ) {

        if ( $this->checkToken( $request ) ) {
            return $next( $request );
        }

        return response()->json( [ 'error' => 'Unauthorized' ], 403 );


    }

    public function checkToken( $request ) {

        $client = $request->header( 'client' );
        $token  = $request->header( 'token' );

        $checkToken = ApiToken::where( 'client', $client )
                              ->where( 'token', $token )->first();

        return $checkToken;
    }
}

Маршрут по API

Я извлечение результатов из ApiToken таблица просто для проверки:

Route::get('/', function(Request $request) {
    return ApiToken::all();
})->middleware('apiAccess');

Оптимизирован для работы с Мухаммад Науман'ы ответ здесь

public function checkToken( $request ) {

    $client = $request->header( 'client' );
    $token  = $request->header( 'token' );

    return ApiToken::where( 'client', $client )
                          ->where( 'token', $token )->exists();
// Nicer, and it will return true and false based on the existence of the token and client.
}


325
3
задан 14 апреля 2018 в 11:04 Источник Поделиться
Комментарии
1 ответ

Мой взгляд на это следующий:


  1. переименовать middleware на что-то осмысленное (я взял пример из VerifyCsrfToken промежуточного)

  2. бросать исключение, если маркер является несоответствие

  3. переименовать checkToken для verifyчитатель кода знает, что код проверяет/проверяет маркер, потому что это пункт промежуточного

  4. упростить еще больше verify функции и добавить заголовочный блок

  5. оптимизировать запрос к следующему


    select exists(select `id` from `tokens` where (`client` = 'Android' and `token` = 'OuK0ELzYkN3Ss9Zf')) as `exists`


Так ApiAccess будет следующим:

<?php

namespace App\Http\Middleware;

use App\Exceptions\TokenMismatchException;
use App\ApiToken;
use Closure;

class VerifyApiToken
{

/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
*
* @return mixed
* @throws \App\Exceptions\TokenMismatchException
*/
public function handle(Request $request, Closure $next)
{
if ($this->verify($request)) {
return $next($request);
}

throw new TokenMismatchException;
}

/**
* Verify token by querying database for existence of the client:token pair specified in headers.
*
* @param \Illuminate\Http\Request $request
*
* @return bool
*/
public function verify($request): bool //optional return types
{
return ApiToken::select('id')->where([ // add select so Eloquent does not query for all fields
'client' => $request->header('client'), // remove variable that is used only once
'token' => $request->header('token'), // remove variable that is used only once
])->exists();
}
}

Создать новое исключение, php artisan make:exception TokenMismatchException - да какой же фреймворк Laravel акций при CSRF-токен несоответствие.

С телом:

<?php

namespace App\Exceptions;

use Exception;

class TokenMismatchException extends Exception
{

/**
* Report the exception.
*
* @return void
*/
public function report()
{
//
}

/**
* Render the exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
*
* @return \Illuminate\Http\Response|null
*/
public function render($request)
{
if ($request->wantsJson()) { // if request has `Accept: application/json` header present
return response()->json(['error' => 'Unauthorized'], 403);
}

return abort(403);
}
}


Примечание: удалить use function response; заявления, потому что помощники автоматически загружаются с фреймворк Laravel помощники

1
ответ дан 9 мая 2018 в 09:05 Источник Поделиться