【问题标题】:Best way to make restfull API in Laravel在 Laravel 中制作宁静 API 的最佳方法
【发布时间】:2021-02-19 01:47:43
【问题描述】:

我正在使用 Laravel 4 为外部网站制作一个完整的 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,所以最好使用HTTP Basic Auth,即为每个请求进行一次登录

网址http://myapi.local/posts/all

标题Authorization: Basic dGVzdDoxMjM0

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

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

如何处理 Laravel 中的 Authorization 标头?解码 base64 然后拆分凭据?

有没有更好的方法来做到这一点?

谢谢!

【问题讨论】:

  • @Rafael 因为它是一个完整的 API,所以它是无状态的,没有会话,没有 cookie ;)
  • 嗯,是的,我看到你可以使用 WWW-Authenticate 响应,例如 WWW-Authenticate: Basic realm="myRealm"
  • @Rafael hmmm 我会尝试this,它使用普通 php ($_SERVER['PHP_AUTH_USER']) 获取身份验证凭据,但我正在寻找内置的 Laravel 方式:P
  • 请记住,Auth Basic 使用的是 base64,因此您需要使用 SSL 保护 TCP 连接
  • 另外,为了安全起见,您可能希望将 HTTP 请求连接标头设置为非持久性。如果您所做的只是发送信息包。这更安全。默认情况下,http 连接是持久的,这意味着套接字为连接保持打开状态。您应该仅在需要时关闭和打开套接字。

标签: authentication laravel


【解决方案1】:

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

已编辑

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

/**
 * 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:

【讨论】:

  • 对!但我根本没有使用数据库,我只是将请求转发到另一个域
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-12
  • 2011-07-21
  • 1970-01-01
  • 2012-04-01
  • 2016-08-15
  • 2014-02-24
相关资源
最近更新 更多