无法通过我的Lumen后端访问Javascript Web令牌

时间:2019-12-02 16:00:03

标签: php laravel ldap jwt lumen

我正在关注本教程https://medium.com/tech-tajawal/jwt-authentication-for-lumen-5-6-2376fd38d454,以了解如何为我的管腔后端设置基于令牌的身份验证。

到目前为止,一切正常。直到最后,我才无法获得代币Oo 我认为我的代码没有任何问题。 使用RESTClient进行http请求时:“ http://localhost:8080/users” 我得到了所需的“'错误':'未提供令牌'”

但是,当我尝试按照本教程中的说明获取令牌时,出现错误,提示未提供名称和电子邮件字段。 这是我的控制器代码(或本教程中的代码),用于评估对传输的名称和电子邮件值的请求:

<?php
namespace App\Http\Controllers;
use Validator;
use App\User;
use Firebase\JWT\JWT;
use Illuminate\Http\Request;
use Firebase\JWT\ExpiredException;
use Illuminate\Support\Facades\Hash;
use Laravel\Lumen\Routing\Controller as BaseController;
class AuthController extends BaseController
{
    /**
     * The request instance.
     *
     * @var \Illuminate\Http\Request
     */
    private $request;
    /**
     * Create a new controller instance.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    public function __construct(Request $request) {
        $this->request = $request;
    }
    /**
     * Create a new token.
     *
     * @param  \App\User   $user
     * @return string
     */
    protected function jwt(User $user) {
        $payload = [
            'iss' => "lumen-jwt", // Issuer of the token
            'sub' => $user->id, // Subject of the token
            'iat' => time(), // Time when JWT was issued.
            'exp' => time() + 60*60 // Expiration time
        ];

        // As you can see we are passing `JWT_SECRET` as the second parameter that will
        // be used to decode the token in the future.
        return JWT::encode($payload, env('JWT_SECRET'));
    }
    /**
     * Authenticate a user and return the token if the provided credentials are correct.
     *
     * @param  \App\User   $user
     * @return mixed
     */
    public function authenticate(User $user) {
        $this->validate($this->request, [
            'email'     => 'required|email',
            'password'  => 'required'
        ]);
        // Find the user by email
        $user = User::where('email', $this->request->input('email'))->first();
        if (!$user) {
            // You wil probably have some sort of helpers or whatever
            // to make sure that you have the same response format for
            // differents kind of responses. But let's return the
            // below respose for now.
            return response()->json([
                'error' => 'Email does not exist.'
            ], 400);
        }
        // Verify the password and generate the token
        if (Hash::check($this->request->input('password'), $user->password)) {
            return response()->json([
                'token' => $this->jwt($user)
            ], 200);
        }
        // Bad Request response
        return response()->json([
            'error' => 'Email or password is wrong.'
        ], 400);
    }
}

这是中间件的代码:

<?php
namespace App\Http\Middleware;
use Closure;
use Exception;
use App\User;
use Firebase\JWT\JWT;
use Firebase\JWT\ExpiredException;
class JwtMiddleware
{
    public function handle($request, Closure $next, $guard = null)
    {
        $token = $request->get('token');

        if(!$token) {
            // Unauthorized response if token not there
            return response()->json([
                'error' => 'Token not provided.'
            ], 401);
        }
        try {
            $credentials = JWT::decode($token, env('JWT_SECRET'), ['HS256']);
        } catch(ExpiredException $e) {
            return response()->json([
                'error' => 'Provided token is expired.'
            ], 400);
        } catch(Exception $e) {
            return response()->json([
                'error' => 'An error while decoding token.'
            ], 400);
        }
        $user = User::find($credentials->sub);
        // Now let's put the user in the request class so that you can grab it from there
        $request->auth = $user;
        return $next($request);
    }
}

我已经在bootstrap / app.php中注册过:

 $app->routeMiddleware([
     'jwt.auth' => App\Http\Middleware\JwTMiddleware::class,
 ]);

但是我的JSON有效负载看起来像这样,所以应该可以工作。

[
  {
    "email": "ibeier@hotmail.com,
    "name": "Eusebio Dach",

  }
]

但是,我必须承认,本节中的教程在细节上有些欠缺。 这是我无法工作的(最后)部分:

” 为了使此私密请求成功,我们需要提供令牌作为查询参数。我们可以通过在Postman应用程序中点击以下路线http://localhost:8000/auth/login来获得令牌。现在,您已经打开了私密失败请求的令牌,这次在“参数”部分中创建一个密钥令牌,并将其值设置为您在上一个请求中收到的令牌。然后将请求发送到http://localhost/users路由,您将得到用户列表作为响应。 (带有用户数据的屏幕截图,请参阅教程) 到此为止。如有任何疑问,请在下面留下您的评论。 “

我不确定是否提供了正确的请求数据,以及是否正确设置了所有标头。 也许对此有更多了解的人可以帮助我理解我所缺少的东西。 我已经尝试过研究其他教程,但是这些教程对内腔采用了不同的jwt扩展,并且似乎在其控制器代码中也采用了其他方法。 我非常想遵循本教程,因为它的方法对我而言似乎很简单。 如果有人可以告诉我该教程对他们有用,并且除了通过教程提供的说明之外,还可以告诉我他们做了什么,这也将有所帮助。 因为那样的话,我将再次进行本教程,看看是否可以使它正常工作。

0 个答案:

没有答案