我想让每个没有令牌访问权限的客户端都无法使用我的API。
这意味着Android应用会在标题client
和android
的标题中以token
和token 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;
}
}
我从ApiToken表中获取结果只是为了检查。
Route::get('/', function(Request $request) {
return ApiToken::all();
})->middleware('apiAccess');
答案 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返回时有未经授权的错误。