在Laravel中制作restful API的最佳方法

时间:2015-02-03 03:15:20

标签: authentication laravel

我正在使用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,然后拆分凭证?

有更好的方法吗?

谢谢!

1 个答案:

答案 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');
});

Basic Auth Docs

<强> 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: