如何在 Laravel 中为 REST API 创建身份验证
How to create authentication in Laravel for REST API
我正在使用 Laravel 框架创建 REST API。一切都很好 !但是我有一个关于自定义身份验证和授权的问题。
默认情况下 Laravel 在内核中有一些基本的身份验证,它是 desktop/browser 应用程序的重要安全层,但对于主要用于移动设备的 REST API 它是多余的。
所以我在 Kernel.php
中评论了这些行
/* \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,*/
相反,我创建了自己的中间件 class 并将其绑定到路由
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'auth.token' => \App\Http\Middleware\TokenAuthMiddleware::class,
'auth.simple' => \App\Http\Middleware\AuthBasicMiddleware::class,
];
我决定使用通用方法 - 令牌(没有 OAuth 服务器)。令牌是为响应用户凭据而发出的,而不是在需要时才刷新。
我的中间件 class 只是骨架
<?php
namespace App\Http\Middleware;
use Closure;
class TokenAuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
dd($request->header());
return $next($request);
}
}
我计划在请求中使用来自 Authorization
header 的令牌并检查它是否有效且未过期允许用户访问受保护的内容。
我想在我的中间件中执行此操作 class.But 我有一个问题,我没有从请求中收到 headers。为了测试 API,我使用 Chrome Extension(Advance Rest Client)或 Curl,但它们都不起作用,我的意思是客户端工作正常,但我认为问题出在 laravel。
问题是我在请求中手动指定了 header,但其中 none 出现在 laravel dd - dd($request->header());
中。
我尝试了不同的 headers,它们都有效,但不是全部,但其中一些除外 Authorization
header.
这是一个例子
Request headers
CSP: active
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36
From: asdasdsadsa
Authorization: token=20sadsa
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2
Cookie: PHPSESSID=sdotvgu9bvm63b947h5d98nk72; language=ru; currency=UAH
以及我从 dd 得到的结果
array:9 [
"host" => array:1 [
0 => "myhost ip"
]
"connection" => array:1 [
0 => "keep-alive"
]
"csp" => array:1 [
0 => "active"
]
"user-agent" => array:1 [
0 => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36"
]
"from" => array:1 [
0 => "asdasdsadsa"
]
"accept" => array:1 [
0 => "*/*"
]
"accept-encoding" => array:1 [
0 => "gzip, deflate, sdch"
]
"accept-language" => array:1 [
0 => "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2"
]
"cookie" => array:1 [
0 => "PHPSESSID=myphpsession; language=ru; currency=UAH"
]
]
如您所见,From
header 有效,但转储中不存在授权 header。
对我来说,似乎 laravel 在我的中间件之前消耗并删除了 Authorization header ,即使我已经为任何请求评论了默认中间件。
请帮忙解决这个问题。或者也许还有另一种更好的方法来在 REST API 中进行身份验证?如有任何建议、批评,我将不胜感激。
谢谢。
问题不在 Laravel
中,而是在 Apache Web 服务器配置文件中。
将此行添加到 .htaccess
文件到 public
目录中。
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
解决了问题。
P.S。
如果有其他更好的方法来处理 REST API 授权 + Laravel,请发表评论。
我一直在寻找相同的答案,我发现这个 link 非常有用,其中包含使用 JWT LINK 的 L5 的详细信息和用法。
第二个解决方案是:
JSON WEB TOKEN
希望它能帮助你。
我正在使用 Laravel 框架创建 REST API。一切都很好 !但是我有一个关于自定义身份验证和授权的问题。
默认情况下 Laravel 在内核中有一些基本的身份验证,它是 desktop/browser 应用程序的重要安全层,但对于主要用于移动设备的 REST API 它是多余的。
所以我在 Kernel.php
/* \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,*/
相反,我创建了自己的中间件 class 并将其绑定到路由
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'auth.token' => \App\Http\Middleware\TokenAuthMiddleware::class,
'auth.simple' => \App\Http\Middleware\AuthBasicMiddleware::class,
];
我决定使用通用方法 - 令牌(没有 OAuth 服务器)。令牌是为响应用户凭据而发出的,而不是在需要时才刷新。
我的中间件 class 只是骨架
<?php
namespace App\Http\Middleware;
use Closure;
class TokenAuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
dd($request->header());
return $next($request);
}
}
我计划在请求中使用来自 Authorization
header 的令牌并检查它是否有效且未过期允许用户访问受保护的内容。
我想在我的中间件中执行此操作 class.But 我有一个问题,我没有从请求中收到 headers。为了测试 API,我使用 Chrome Extension(Advance Rest Client)或 Curl,但它们都不起作用,我的意思是客户端工作正常,但我认为问题出在 laravel。
问题是我在请求中手动指定了 header,但其中 none 出现在 laravel dd - dd($request->header());
中。
我尝试了不同的 headers,它们都有效,但不是全部,但其中一些除外 Authorization
header.
这是一个例子
Request headers
CSP: active
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36
From: asdasdsadsa
Authorization: token=20sadsa
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2
Cookie: PHPSESSID=sdotvgu9bvm63b947h5d98nk72; language=ru; currency=UAH
以及我从 dd 得到的结果
array:9 [
"host" => array:1 [
0 => "myhost ip"
]
"connection" => array:1 [
0 => "keep-alive"
]
"csp" => array:1 [
0 => "active"
]
"user-agent" => array:1 [
0 => "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36"
]
"from" => array:1 [
0 => "asdasdsadsa"
]
"accept" => array:1 [
0 => "*/*"
]
"accept-encoding" => array:1 [
0 => "gzip, deflate, sdch"
]
"accept-language" => array:1 [
0 => "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4,uk;q=0.2"
]
"cookie" => array:1 [
0 => "PHPSESSID=myphpsession; language=ru; currency=UAH"
]
]
如您所见,From
header 有效,但转储中不存在授权 header。
对我来说,似乎 laravel 在我的中间件之前消耗并删除了 Authorization header ,即使我已经为任何请求评论了默认中间件。
请帮忙解决这个问题。或者也许还有另一种更好的方法来在 REST API 中进行身份验证?如有任何建议、批评,我将不胜感激。
谢谢。
问题不在 Laravel
中,而是在 Apache Web 服务器配置文件中。
将此行添加到 .htaccess
文件到 public
目录中。
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
解决了问题。
P.S。
如果有其他更好的方法来处理 REST API 授权 + Laravel,请发表评论。
我一直在寻找相同的答案,我发现这个 link 非常有用,其中包含使用 JWT LINK 的 L5 的详细信息和用法。
第二个解决方案是: JSON WEB TOKEN
希望它能帮助你。