Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 拉维野狗JWT_Php_Laravel_Jwt_Dingo Api - Fatal编程技术网

Php 拉维野狗JWT

Php 拉维野狗JWT,php,laravel,jwt,dingo-api,Php,Laravel,Jwt,Dingo Api,我目前正在用Laravel编写一个API,并将其作为身份验证 它工作正常,我已经将Dingo config设置为受保护的,因此始终需要一个有效的JWT令牌,否则它将失败并出现401错误。同样,它工作得很好 问题是。。如何自定义错误消息?现在是这样的 { message: "JWT has expired", status_code: 401, debug: { "..." } } 至少我想把“JWT已经过期”改成自定义文本,无论是JWT还是Dingo,但当然,如

我目前正在用Laravel编写一个API,并将其作为身份验证

它工作正常,我已经将Dingo config设置为受保护的,因此始终需要一个有效的JWT令牌,否则它将失败并出现401错误。同样,它工作得很好

问题是。。如何自定义错误消息?现在是这样的

{
    message: "JWT has expired",
    status_code: 401,
    debug: { "..."
    }
}
至少我想把“JWT已经过期”改成自定义文本,无论是JWT还是Dingo,但当然,如果可以进一步自定义,那就太好了

有什么建议吗?谢谢

我找到了解决办法

通过创建我自己的提供程序(或者扩展默认的FirebaseProvider),并将配置设置为使用自定义提供程序

默认值是

'provider' => 'Tymon\JWTAuth\Providers\FirebaseProvider'
改为

'provider' => 'CustomPackages\Providers\MyFirebaseProvider'

我同意这个解决方案可能不是最优雅的方式。但是它可以工作,我很高兴听到其他解决方案

我的解决方案是创建一个AuthController类,如下代码所示:

<?php

namespace App\Http\ApiControllers\V1;

use App\Http\Controllers\Controller;
use Dingo\Api\Routing\Helpers;

class BaseController extends Controller
{
    use Helpers;
}

<?php
/**
 * Created by PhpStorm.
 * User: ***
 * Date: 26/10/2016
 * Time: 14:07
 */

namespace App\Http\ApiControllers\V1;

use App\Http\Requests\AddUserRequest;
use App\Http\Transformer\UserTransformer;
use Illuminate\Http\Request;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;


class AuthController extends BaseController
{

    public function authenticate(Request $request)
    {
        // grab credentials from the request
        $credentials = $request->only('email', 'password');
        try {
            // attempt to verify the credentials and create a token for the user
            if (!$token = JWTAuth::attempt($credentials)) {
                //                return response()->json(['error' => 'invalid_credentials'], 401);
                //return response()->json(['error' => '用户名或密码错误'], 401);
                return $this->response->error('用户名或密码错误', 401);
            }
        } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            //            return response()->json(['error' => 'could_not_create_token'], 500);
            //            return response()->json(['error' => '创建 token 失败'], 500);
            return $this->response->error('创建 token 失败', 500);
        }

        // all good so return the token
        return response()->json(compact('token'));

        //        return $this->response->item($token);
    }


    public function getAuthenticatedUser()
    {
        try {

            if (!$user = JWTAuth::parseToken()->authenticate()) {
                return $this->response->errorNotFound('没有此用户');
            }

        } catch (TokenExpiredException $e) {

            return $this->response->errorUnauthorized('token_expired');

        } catch (TokenInvalidException $e) {

            return $this->response->errorBadRequest('token_invalid');

        } catch (JWTException $e) {

            return $this->response->errorInternal('token_absent');

        }

          return $this->response->item($user,new UserTransformer());
    }


}