我正在使用Laravel 4为一个外部网站制作一个用于网页报废的restfull API。
目标网站有一个登录表单,因此每个请求都需要进行身份验证。
如果用户想要发布或查看内容,他会向我的服务器发出请求,向目标服务器发出另一个请求,获取信息,然后用JSON对其进行编码。
我的问题是如何在API请求中获取凭据?
现在我有类似http://myapi.local/login
的内容(这会向http://externalsite.com/admin/login
发出请求),
POST参数为username=test&password=1234
,并返回会话ID
然后对于每个操作,我将会话ID附加到我的api请求
http://myapi.local/posts/all?session_id=4D2FtE...
但这根本不是完整的,所以最好是使用HTTP Basic Auth,即为每个请求进行一次登录
网址:http://myapi.local/posts/all
标题:Authorization: Basic dGVzdDoxMjM0
并在我的控制器中调用登录功能。
速度较慢,因为它每次都会向目标网站发出两次请求,但似乎更好,因为我不保存任何会话或凭据。
我如何处理Laravel中的Authorization标头?解码base64,然后拆分凭证?
有更好的方法吗?
谢谢!
答案 0 :(得分:2)
Laravel自己处理基本身份验证,唯一要做的就是考虑在哪里可以使用过滤器(Laravel使用过滤器处理基本身份验证),所以:
a)在路线中:
Route::get('posts/all', array('before' => 'auth.basic', function()
{
// Only authenticated users may enter...
}));
b)控制器中的构造函数(我更喜欢这个):
function __construct() {
$this->beforeFilter('auth.basic');
}
如果适用于您的情况,也可以进行此调整,因为laravel文档说:
默认情况下,基本过滤器将使用用户的电子邮件列 验证时记录。如果您想使用其他专栏,您可以 将列名作为第一个参数传递给基本方法 你的app / filters.php文件:
Route::filter('auth.basic', function()
{
return Auth::basic('username');
});
<强> EDITED 强>
在您的情况下,您可能希望以这两种方法为基础实现自定义过滤器。
/**
* Get the credential array for a HTTP Basic request.
*/
function getBasicCredentials(Request $request, $field)
{
return array($field => $request->getUser(), 'password' => $request->getPassword());
}
/**
* Get the response for basic authentication.
*
* @return \Symfony\Component\HttpFoundation\Response
*/
function getBasicResponse()
{
$headers = array('WWW-Authenticate' => 'Basic');
return new Response('Invalid credentials.', 401, $headers);
}
请参阅默认实施here: