没有jwt令牌的控制器方法返回值

时间:2019-09-14 11:27:16

标签: laravel jwt

我已经配置了Jwt/tymon API身份验证并使用了自定义模型,我要的是没有JWT在登录时生成的令牌,不应访问控制器功能

路线

Route::group([
    'middleware' => 'api'
    // 'prefix' => 'auth'

], function ($router) {
    Route::post('auth/mpalogin', 'MpaLoginController@mpaLogin')->name('login');
    Route::post('auth/mpalogout', 'MpaLoginController@logout');
    Route::post('auth/mparefresh', 'MpaLoginController@refresh');
    Route::post('auth/mpame', 'MpaLoginController@myinfo');
    Route::post('auth/mpag', 'MpaLoginController@awain');
});

CONTROLLER->最后,无需发送令牌即可访问awain方法,这是我不希望的,我希望我在此控制器中创建的每个方法都只能由令牌访问< / strong>

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Http\Requests;
use Config;
use JWTAuth;
use JWTAuthException;
use App\Mpa;

class MpaLoginController extends Controller
{
    public function __construct()
    {

        Config::set('jwt.user', Mpa::class);
        Config::set('auth.providers', ['users' => [
                'driver' => 'eloquent',
                'model' => Mpa::class,
            ]]);
        $this->middleware('auth', ['except' => ['mpaLogin']]);
    }

    public function mpaLogin(Request $request){
        $credentials = $request->only('email', 'password');
        $token = null;
        try {
            if (!$token = auth()->attempt($credentials)) {
                return response()->json([
                    'response' => 'error',
                    'message' => 'invalid_email_or_password',
                ]);
            }
        } catch (JWTAuthException $e) {
            return response()->json([
                'response' => 'error',
                'message' => 'failed_to_create_token',
            ]);
        }
        return response()->json([
            'response' => 'success',
            'result' => [
                'token' => $token,
                'message' => 'I am front mpa',
            ],
        ]);
    }

    /**
     * Get the authenticated User.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function myinfo()
    {
        return response()->json(auth()->user());
    }

    /**
     * Log the user out (Invalidate the token).
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        auth()->logout();

        return response()->json(['message' => 'Mpa Successfully logged out']);
    }

    /**
     * Refresh a token.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    /**
     * Get the token array structure.
     *
     * @param  string $token
     *
     * @return \Illuminate\Http\JsonResponse
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }

    public function awain()
    {
        return response()->json("xyz");
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试这种方式。

  1. 将此中间件文件添加到您的App\Http\Middleware文件夹中。 文件名必须为JWTMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;
use App\Models\Authentication\Auth;
use Tymon\JWTAuth\Facades\JWTAuth;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Exceptions\TokenInvalidException;
use Tymon\JWTAuth\Exceptions\JWTException;

class JWTMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if (is_null($request->bearerToken())) {
            return response()->json(['error' => 'Token required.'], 401);
        }

        try {
            // attempt to verify the credentials and create a token for the user
            $token = JWTAuth::getToken();
            $apy = JWTAuth::getPayload($token)->toArray();

        } catch (TokenExpiredException $e) {

            return response()->json(['error' => 'Session Expired.', 'status_code' => 401], 401);

        } catch (TokenInvalidException $e) {

            return response()->json(['error' => 'Token invalid.', 'status_code' => 401], 401);

        } catch (JWTException $e) {

            return response()->json(['token_absent' => $e->getMessage()], 401);

        }

        return $next($request);
    }
}

  1. $routeMiddleware文件的App\Http\kernel.php中注册此中间件。
protected $routeMiddleware = [
       ....
       ....
       'jwt' => \App\Http\Middleware\JWTMiddleware::class,
   ];

  1. 将此中间件添加到您的Route组。
Route::group(['middleware' => [ 'jwt', 'jwt.auth']], function () {
    ....
    ....
    });

工作示例存储库:  https://github.com/kennethtomagan/laravel-5-api-boilerplate/

答案 1 :(得分:0)

替换

C:\wherever-you-cloned-pio-repository\predictionio\docker\pio\pio_run

有了这个

$this->middleware('auth', ['except' => ['mpaLogin']]);

还要从路由组中删除中间件。在将中间件代码添加到控制器的结构中时。