Laravel5.2 API验证问题

默认的是通过URL domain.com/abc?api_token=xxx认证用户身份的,现在想要请求的时候headers带上api_token,URL不带参数来请求认证。要怎么实现?

JellyBool

你可以自定义header撒,然后要求用户在请求的时候必须携带这个token,例子可以参考laravel的X-CSRF-TOKEN或者Ping++的X-Pingplusplus-Signature

mingyoung

@JellyBool 主要是怎么修改成是验证headers中的api_token值而不是URL参数中的api_token?

JellyBool

首先,我假设你给用户签发一个token,然后你在数据库维护一个相对应的token,然后,你看看laravel的实现:

protected function tokensMatch($request)
    {
        $sessionToken = $request->session()->token();

        $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

        if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
            $token = $this->encrypter->decrypt($header);
        }

        if (! is_string($sessionToken) || ! is_string($token)) {
            return false;
        }

        return hash_equals((string) $request->session()->token(), (string) $token);
    }

然后你把这里的session换成你的sql查询应该差不多了

mingyoung

Laravel5.2中的,是这个方法获取api_token的吗?

mingyoung

@JellyBool 如上,如果是的话那要怎么重写它?

JellyBool

你图片当中的应该是后去form表单的_token这个的,就是用于CSRF防护的这个。

mingyoung

@JellyBool 这个不是csrf的,这个是用于API的token验证的。(☆_☆)

mingyoung

@JellyBool Laravel5.2新的APIAuth特性

JellyBool

OK,恩,我看了一下源码和最新的文档,这个确实是token的认证 #_#!

然后至于重写,我大概可以想到下面的思路:

protected function getTokenForRequest()
    {
        $token = $this->request->input($this->inputKey);
      /*
    这里面的$this->inputKey写死为 api_token,那么如果你想用header的形式的话,
    其实就是换一下这一句就差不多,
    比如 $token = $this->request->header('LARAVEL-API-TOKEN');
 */

        if (empty($token)) {
            $token = $this->request->bearerToken();
        }

        if (empty($token)) {
            $token = $this->request->getPassword();
        }

        return $token;
    }

以上的注释部分你可以参考一下,这时候注意,这个LARAVEL-API-TOKEN是你自定义的一个key,你得跟使用你api的客户商议好,这个key用什么。然后你的客户在调用你的api的时候,必须提供这个header。有啥想法继续交流

mingyoung

@JellyBool 只能改这里了吗?如果以后更新的话就覆盖咯?