Authentication 在Laravel中创建restfull API的最佳方法

Authentication 在Laravel中创建restfull API的最佳方法,authentication,laravel,Authentication,Laravel,我正在用Laravel4为一个外部网站制作一个restfull API,用于抓取网页 目标站点有一个登录表单,因此每个请求都需要身份验证 如果用户想要发布或查看某个内容,他会向我的服务器发出请求,然后向目标服务器发出另一个请求,获取信息,并将其编码为JSON 我的问题是如何在API请求中获取凭据? 现在我有了类似http://myapi.local/login(这会向http://externalsite.com/admin/login), POST参数是username=test&passwo

我正在用Laravel4为一个外部网站制作一个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...

但这根本不是restfull,因此最好是使用httpbasicauth,即为每个请求进行一次登录

url
http://myapi.local/posts/all

标题
授权:基本dGVzdDoxMjM0

并调用控制器中的登录函数

它的速度较慢,因为它每次向目标站点发出两个请求,但似乎更好,因为我不保存任何会话或凭据

我如何处理Laravel中的授权标头?解码base64,然后拆分凭据

有更好的方法吗


谢谢大家!

Laravel自己处理基本身份验证,唯一要做的就是考虑在哪里可以使用过滤器(Laravel使用过滤器处理基本身份验证),因此:

a) 在路线上:

b) 控制器中的构造函数(我更喜欢这个):

如laravel docs所述,如果适用于您的情况,也要进行此调整:

默认情况下,基本筛选器将使用用户的电子邮件列 验证时记录。如果您希望使用另一列,您可以 将列名作为第一个参数传递给中的基本方法 您的app/filters.php文件:

已编辑

在您的情况下,您可能希望以这两种方法为基础实现一个自定义过滤器

/**
 * 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);
}

查看默认实现

@Rafael,因为它是一个restfull API,所以它是无状态的,没有会话,没有cookie;)啊,好的,是的,我看到你可以使用WWW-Authenticate响应,比如
WWW-Authenticate:Basic realm=“myRealm”
@Rafael-hmmm我会试试,它用普通的php(
$\u-SERVER['php\u-auth\u-USER']
)获取身份验证凭据,但我一直在寻找一种内置的Laravel方法:PKeep记住Auth Basic使用的是base64,因此您需要使用SSLAlso来保护TCP连接的安全性。为了安全起见,您可能需要将HTTP请求连接头设置为非持久性。如果你所做的只是发送信息包。这样更安全。默认情况下,http连接是持久的,这意味着套接字对连接保持打开状态。你应该只在需要的时候才打开和关闭插座。对!但我根本没有使用数据库,我只是将请求转发到另一个域
function __construct() {
    $this->beforeFilter('auth.basic');
}
Route::filter('auth.basic', function()
{
    return Auth::basic('username');
});
/**
 * 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);
}