这是制作Laravel令牌中间件的正确方法吗?

时间:2018-04-14 10:49:37

标签: laravel

我想让每个没有令牌访问权限的客户端都无法使用我的API。

这意味着Android应用会在标题clientandroid的标题中以tokentoken string作为client发送token

现在在middleware,我正在使用我的表字段检查它以通过授权。如果两者都匹配,那么我将授权,如果不匹配,则会发送403响应。

  

我知道Passport,但它不是我想要的。事实上,   将其视为第一层安全性,然后使用Passport作为   第二层安全性来授权API

这段代码是否正确?

由于我对Laravel - Middleware不太熟悉,我只想从专家那里得到一些反馈,我所编写的代码是否准确且符合标准。如果没有,我将非常感谢您的建议和帮助,使其变得更好。

中间件

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');

1 个答案:

答案 0 :(得分:1)

我无法添加评论,所以写在这里。这似乎对我来说,但我不认为需要额外的层。也许你的要求需要它。无论如何,您可以改进checkToken函数以返回布尔值。这是:

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.
}

还有一件事,当禁止访问时返回状态代码403。 401返回时有未经授权的错误。