1. 程式人生 > >Laravel 使用 JWT 做 API 認證之tymon/jwt-auth 1.0.0-beta.1實踐 - moell - SegmentFault

Laravel 使用 JWT 做 API 認證之tymon/jwt-auth 1.0.0-beta.1實踐 - moell - SegmentFault

安裝

"tymon/jwt-auth": "1.0.0-beta.1" 新增到 composer.json 中,執行 composer update

Providers

config/app.php 中在 providers 裡新增 Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

Class Aliases

config/app.php 中在 aliases 裡新增 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class

修改認證驅動

修改config/auth.php,將 api 的 driver 修改為 jwt。如下:

'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
        ],
    ]

新增路由

在 routes/api.php

 中新增以下路由:

$api = app('Dingo\Api\Routing\Router');

$api->version('v1', ['namespace' => 'App\Http\Controllers\Api\V1'], function($api) {
    $api->post('token', '[email protected]');    //獲取token
    $api->post('refresh-token', '[email protected]'); //重新整理token

    $api->group(['middleware' => ['auth:api']], function($api) {
        $api->post('logout', '
[email protected]
'); //登出 $api->get('me', '[email protected]'); //關於我 }); });

AppUser.php

新增 getJWTIdentifier 和 getJWTCustomClaims 實現 AuthenticatableUserContract

<?php

namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Tymon\JWTAuth\Contracts\JWTSubject as AuthenticatableUserContract;

class User extends Authenticatable implements AuthenticatableUserContract
{


    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey(); // Eloquent model method
    }

    /**
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }

}

實現路由所需要的控制器

<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Api\V1\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Tymon\JWTAuth\Exceptions\JWTException;
use Auth;

class UserController extends Controller
{

    protected $guard = 'api';

    /**
     * 獲取token
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function token(Request $request)
    {
        $credentials=[
            'email' => $request->email,
            'password'  => $request->password,
            'status' => 0,
        ];

        try {
            if (! $token = Auth::guard($this->guard)->attempt($credentials)) {
                return response()->json(['error' => 'invalid_credentials'], 401);
            }
        } catch (JWTException $e) {
            return response()->json(['error' => 'could_not_create_token'], 500);
        }

        return response()->json(compact('token'));
    }

    /**
     * @return mixed
     */
    public function refershToken()
    {
        $token = Auth::guard($this->guard)->refresh();

        return $this->response->array(compact('token'));
    }

    /**
     * 個人資訊
     *
     * @return User|null
     */
    public function me()
    {
        return Auth::guard('api')->user();
    }

    /**
     * 退出
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function logout()
    {
        Auth::guard($this->guard)->logout();
        return response()->json(['status' => 'ok']);
    }
}

原文地址
http://moell.cn/article/37