Authentication 在Laravel中创建restfull API的最佳方法
我正在用Laravel4为一个外部网站制作一个restfull API,用于抓取网页 目标站点有一个登录表单,因此每个请求都需要身份验证 如果用户想要发布或查看某个内容,他会向我的服务器发出请求,然后向目标服务器发出另一个请求,获取信息,并将其编码为JSON 我的问题是如何在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
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);
}