[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-cats-ngidenet":3,"blog-detail-ngidenet-membuat-rest-api-dengan-lumen-authentication-dengan-jwt-auth":20},{"items":4},[5,9,13,17],{"name":6,"slug":7,"count":8},"Digital Marketing","digital-marketing",41,{"name":10,"slug":11,"count":12},"Programming","programming",56,{"name":14,"slug":15,"count":16},"Tips","tips",75,{"name":18,"slug":19,"count":8},"Web Development","web-development",{"id":21,"slug":22,"title":23,"short_text":24,"excerpt":24,"cover":25,"cover_image":25,"cover_alt_text":25,"category":10,"tags":26,"published_at":27,"created_at":28,"full_text":29,"meta_title":25,"meta_description":30,"faqs":31,"images":32,"views_count":33},364,"membuat-rest-api-dengan-lumen-authentication-dengan-jwt-auth","Membuat REST API dengan Lumen: Authentication dengan JWT Auth","Agus Yusida October 21, 2018 Melanjutkan part 1 sebelumnya tentang membuat rest api dengan lumen, kali ini kita akan melanjutkan rest api sebelumnya dengan menambahkan authentication melalui token. Di",null,[],"2019-08-25T16:00:00Z","2026-07-14T04:39:33.789561Z","\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>  \u003Cimg alt=\"Go to the profile of Agus Yusida\" src=\"http:\u002F\u002F0.gravatar.com\u002Favatar\u002Fc0b0eeb94d5a7fd159a09fd4a506d27b?s=96&amp;d=mm&amp;r=g\"\u002F>  Agus Yusida October 21, 2018\u003Cp>Melanjutkan part 1 sebelumnya tentang membuat rest api dengan lumen, kali ini kita akan melanjutkan rest api sebelumnya dengan menambahkan authentication melalui token. Dimana kita akan menggunakan sebuah Library yaitu JWT Auth.\u003C\u002Fp>\u003Cp>Tutorial ini adalah lanjutan dari part sebelumnya, jadi silakan baca dulu part sebelumnya supaya tidak bingung disini: Membuat REST API dengan Lumen #part 1\u003C\u002Fp>\u003Cp>1. Install JWT Auth Package\u003C\u002Fp>\u003Cp>Cara mudah saja, buka terminal dan jalankan command ini:\u003C\u002Fp> \u003Cpre>\u003Ccode>composer require tymon\u002Fjwt-auth:1.0.0-beta.3\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Tunggu sampai proses install selesai.\u003C\u002Fp>\u003Cp>Setelah itu buka file boostrap\u002Fapp.php dan tambahkan sebuah service provider baru\u003C\u002Fp>\u003Cpre>\u003Ccode>$app-&gt;register(TymonJWTAuthProvidersLumenServiceProvider::class);\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Enable \u003Ccode>$app-&gt;withEloquent();\u003C\u002Fcode> dengan men uncomment\u003C\u002Fp>\u003Cp>Tambahkan midleware baru untuk jwt auth\u003C\u002Fp>\u003Cpre>\u003Ccode>$app-&gt;routeMiddleware([\n    'auth' =&gt; AppHttpMiddlewareAuthenticate::class,\n    'jwt.auth' =&gt; TymonJWTAuthMiddlewareGetUserFromToken::class,\n]);\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Selanjutnya kita harus membuat sebuah secret untuk generate token nanti. Jalankan perintah di bawah ini:\u003C\u002Fp>\u003Cpre>\u003Ccode>php artisan jwt:secret\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>2. Buat Config File\u003C\u002Fp>\u003Cp>Buat sebauh file dengan nama auth.php di dalam folder config, lalu isi dengan file dibawah ini\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;?php\nreturn [\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Authentication Defaults\n    |--------------------------------------------------------------------------\n    |\n    | This option controls the default authentication \"guard\" and password\n    | reset options for your application. You may change these defaults\n    | as required, but they're a perfect start for most applications.\n    |\n    *\u002F\n    'defaults' =&gt; [\n        'guard' =&gt; env('AUTH_GUARD', 'api'),\n        'passwords' =&gt; 'users',\n    ],\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Authentication Guards\n    |--------------------------------------------------------------------------\n    |\n    | Next, you may define every authentication guard for your application.\n    | Of course, a great default configuration has been defined for you\n    | here which uses session storage and the Eloquent user provider.\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | Supported: \"session\", \"token\"\n    |\n    *\u002F\n    'guards' =&gt; [\n        'api' =&gt; [\n            'driver' =&gt; 'jwt',\n            'provider' =&gt; 'users',\n        ],\n    ],\n    \u002F*\n    |--------------------------------------------------------------------------\n    | User Providers\n    |--------------------------------------------------------------------------\n    |\n    | All authentication drivers have a user provider. This defines how the\n    | users are actually retrieved out of your database or other storage\n    | mechanisms used by this application to persist your user's data.\n    |\n    | If you have multiple user tables or models you may configure multiple\n    | sources which represent each model \u002F table. These sources may then\n    | be assigned to any extra authentication guards you have defined.\n    |\n    | Supported: \"database\", \"eloquent\"\n    |\n    *\u002F\n    'providers' =&gt; [\n        'users' =&gt; [\n            'driver' =&gt; 'eloquent',\n            'model' =&gt; AppUser::class,\n        ],\n    ],\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Resetting Passwords\n    |--------------------------------------------------------------------------\n    |\n    | You may specify multiple password reset configurations if you have more\n    | than one user table or model in the application and you want to have\n    | separate password reset settings based on the specific user types.\n    |\n    | The expire time is the number of minutes that the reset token should be\n    | considered valid. This security feature keeps tokens short-lived so\n    | they have less time to be guessed. You may change this as needed.\n    |\n    *\u002F\n    'passwords' =&gt; [\n        'users' =&gt; [\n            'provider' =&gt; 'users',\n            'table' =&gt; 'password_resets',\n            'expire' =&gt; 60,\n        ],\n    ],\n];\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Buat file config baru lagi dengan nama jwt.php di dalam folder config dan isi file dengan kode di bawah ini:\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;?php\nreturn [\n    \u002F*\n    |--------------------------------------------------------------------------\n    | JWT Authentication Secret\n    |--------------------------------------------------------------------------\n    |\n    | Don't forget to set this in your .env file, as it will be used to sign\n    | your tokens. A helper command is provided for this:\n    | `php artisan jwt:secret`\n    |\n    | Note: This will be used for Symmetric algorithms only (HMAC),\n    | since RSA and ECDSA use a private\u002Fpublic key combo (See below).\n    |\n    *\u002F\n    'secret' =&gt; env('JWT_SECRET'),\n    \u002F*\n    |--------------------------------------------------------------------------\n    | JWT Authentication Keys\n    |--------------------------------------------------------------------------\n    |\n    | What algorithm you are using, will determine whether your tokens are\n    | signed with a random string (defined in `JWT_SECRET`) or using the\n    | following public &amp; private keys.\n    |\n    | Symmetric Algorithms:\n    | HS256, HS384 &amp; HS512 will use `JWT_SECRET`.\n    |\n    | Asymmetric Algorithms:\n    | RS256, RS384 &amp; RS512 \u002F ES256, ES384 &amp; ES512 will use the keys below.\n    |\n    *\u002F\n    'keys' =&gt; [\n        \u002F*\n        |--------------------------------------------------------------------------\n        | Public Key\n        |--------------------------------------------------------------------------\n        |\n        | A path or resource to your public key.\n        |\n        | E.g. 'file:\u002F\u002Fpath\u002Fto\u002Fpublic\u002Fkey'\n        |\n        *\u002F\n        'public' =&gt; env('JWT_PUBLIC_KEY'),\n        \u002F*\n        |--------------------------------------------------------------------------\n        | Private Key\n        |--------------------------------------------------------------------------\n        |\n        | A path or resource to your private key.\n        |\n        | E.g. 'file:\u002F\u002Fpath\u002Fto\u002Fprivate\u002Fkey'\n        |\n        *\u002F\n        'private' =&gt; env('JWT_PRIVATE_KEY'),\n        \u002F*\n        |--------------------------------------------------------------------------\n        | Passphrase\n        |--------------------------------------------------------------------------\n        |\n        | The passphrase for your private key. Can be null if none set.\n        |\n        *\u002F\n        'passphrase' =&gt; env('JWT_PASSPHRASE'),\n    ],\n    \u002F*\n    |--------------------------------------------------------------------------\n    | JWT time to live\n    |--------------------------------------------------------------------------\n    |\n    | Specify the length of time (in minutes) that the token will be valid for.\n    | Defaults to 1 hour.\n    |\n    | You can also set this to null, to yield a never expiring token.\n    | Some people may want this behaviour for e.g. a mobile app.\n    | This is not particularly recommended, so make sure you have appropriate\n    | systems in place to revoke the token if necessary.\n    |\n    *\u002F\n    'ttl' =&gt; env('JWT_TTL', 60),\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Refresh time to live\n    |--------------------------------------------------------------------------\n    |\n    | Specify the length of time (in minutes) that the token can be refreshed\n    | within. I.E. The user can refresh their token within a 2 week window of\n    | the original token being created until they must re-authenticate.\n    | Defaults to 2 weeks.\n    |\n    | You can also set this to null, to yield an infinite refresh time.\n    | Some may want this instead of never expiring tokens for e.g. a mobile app.\n    | This is not particularly recommended, so make sure you have appropriate\n    | systems in place to revoke the token if necessary.\n    |\n    *\u002F\n    'refresh_ttl' =&gt; env('JWT_REFRESH_TTL', 20160),\n    \u002F*\n    |--------------------------------------------------------------------------\n    | JWT hashing algorithm\n    |--------------------------------------------------------------------------\n    |\n    | Specify the hashing algorithm that will be used to sign the token.\n    |\n    | See here: https:\u002F\u002Fgithub.com\u002Fnamshi\u002Fjose\u002Ftree\u002Fmaster\u002Fsrc\u002FNamshi\u002FJOSE\u002FSigner\u002FOpenSSL\n    | for possible values.\n    |\n    *\u002F\n    'algo' =&gt; env('JWT_ALGO', 'HS256'),\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Required Claims\n    |--------------------------------------------------------------------------\n    |\n    | Specify the required claims that must exist in any token.\n    | A TokenInvalidException will be thrown if any of these claims are not\n    | present in the payload.\n    |\n    *\u002F\n    'required_claims' =&gt; ['iss', 'iat', 'exp', 'nbf', 'sub', 'jti'],\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Blacklist Enabled\n    |--------------------------------------------------------------------------\n    |\n    | In order to invalidate tokens, you must have the blacklist enabled.\n    | If you do not want or need this functionality, then set this to false.\n    |\n    *\u002F\n    'blacklist_enabled' =&gt; env('JWT_BLACKLIST_ENABLED', true),\n    \u002F*\n    | -------------------------------------------------------------------------\n    | Blacklist Grace Period\n    | -------------------------------------------------------------------------\n    |\n    | When multiple concurrent requests are made with the same JWT,\n    | it is possible that some of them fail, due to token regeneration\n    | on every request.\n    |\n    | Set grace period in seconds to prevent parallel request failure.\n    |\n    *\u002F\n    'blacklist_grace_period' =&gt; env('JWT_BLACKLIST_GRACE_PERIOD', 0),\n    \u002F*\n    |--------------------------------------------------------------------------\n    | Providers\n    |--------------------------------------------------------------------------\n    |\n    | Specify the various providers used throughout the package.\n    |\n    *\u002F\n    'providers' =&gt; [\n        \u002F*\n        |--------------------------------------------------------------------------\n        | JWT Provider\n        |--------------------------------------------------------------------------\n        |\n        | Specify the provider that is used to create and decode the tokens.\n        |\n        *\u002F\n        'jwt' =&gt; TymonJWTAuthProvidersJWTNamshi::class,\n        \u002F*\n        |--------------------------------------------------------------------------\n        | Authentication Provider\n        |--------------------------------------------------------------------------\n        |\n        | Specify the provider that is used to authenticate users.\n        |\n        *\u002F\n        'auth' =&gt; TymonJWTAuthProvidersAuthIlluminate::class,\n        \u002F*\n        |--------------------------------------------------------------------------\n        | Storage Provider\n        |--------------------------------------------------------------------------\n        |\n        | Specify the provider that is used to store tokens in the blacklist.\n        |\n        *\u002F\n        'storage' =&gt; TymonJWTAuthProvidersStorageIlluminate::class,\n    ],\n];\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Edit User Model\u003C\u002Fp>Rekomendasi:  Membuat REST API dengan Lumen #part 1\u003Cp>Buka file User.php yang ada di dalam folder app, dan implement JWTSubject\u003C\u002Fp>\u003Cp>Jadi fungsinya agar model User dikenali oleh JWT auth.\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;?php\nnamespace App;\nuse IlluminateAuthAuthenticatable;\nuse LaravelLumenAuthAuthorizable;\nuse IlluminateDatabaseEloquentModel;\nuse IlluminateContractsAuthAuthenticatable as AuthenticatableContract;\nuse IlluminateContractsAuthAccessAuthorizable as AuthorizableContract;\nuse TymonJWTAuthContractsJWTSubject;\nclass User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject\n{\n    use Authenticatable, Authorizable;\n    \u002F**\n     * The attributes that are mass assignable.\n     *\n     * @var array\n     *\u002F\n    protected $fillable = [\n        'name', 'email',\n    ];\n    \u002F**\n     * The attributes excluded from the model's JSON form.\n     *\n     * @var array\n     *\u002F\n    protected $hidden = [\n        'password',\n    ];\n     \u002F**\n     * Get the identifier that will be stored in the subject claim of the JWT.\n     *\n     * @return mixed\n     *\u002F\n    public function getJWTIdentifier()\n    {\n        return $this-&gt;getKey();\n    }\n    \u002F**\n     * Return a key value array, containing any custom claims to be added to the JWT.\n     *\n     * @return array\n     *\u002F\n    public function getJWTCustomClaims()\n    {\n        return [];\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Tambahkan middleware di routes.\u003C\u002Fp>\u003Cp>Sekarang kita akan memproteksi routes mana yang hanya bisa di akses user jika sudah terauthentikasi.\u003C\u002Fp>\u003Cp>Tambahkan middleware baru di file routes\u002Fweb.php\u003C\u002Fp>\u003Cpre>\u003Ccode>\n$app-&gt;group(['middleware' =&gt; 'jwt.auth'], function () use ($app){\n        $app-&gt;get('products', 'ProductController@index');\n        $app-&gt;get('products\u002F{id}', 'ProductController@show');\n        $app-&gt;post('products', 'ProductController@store');\n        $app-&gt;put('products\u002F{id}', 'ProductController@update');\n        $app-&gt;delete('products\u002F{id}', 'ProductController@delete');\n        $app-&gt;get('categories', 'CategoryController@index');\n        $app-&gt;get('categories\u002F{id}', 'CategoryController@show');\n        $app-&gt;post('categories', 'CategoryController@store');\n        $app-&gt;put('categories\u002F{id}', 'CategoryController@update');\n        $app-&gt;delete('categories\u002F{id}', 'CategoryController@delete');\n    });\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Sekarang kita coba akses routes yang sudah ada di dalam middleware jwt.auth\u003C\u002Fp>\u003Cp>Karena kita melakukan akses tanpa token, maka api akan memberikan respond berupa status 401 dengan pesan berupa UnauthorizedHttpException.\u003C\u002Fp> \u003Cp>Ini artinya api kita sudah berhasil kita lindungi dari user yang mau mengakses tanpa login dulu.\u003C\u002Fp>\u003Cp>Lalu bagaimana caranya supaya kita bisa mengakses api tersebut?\u003C\u002Fp>\u003Cp>Buat AuthController\u003C\u002Fp>\u003Cp>AuthController.php akan berfungsi untuk meng generate token saat user login.\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;?php\nnamespace AppHttpControllers;\nuse IlluminateHttpRequest;\nuse TymonJWTAuthExceptionsJWTException;\nuse TymonJWTAuthExceptionsTokenExpiredException;\nuse TymonJWTAuthExceptionsTokenInvalidException;\nuse TymonJWTAuthJWTAuth;\nclass AuthController extends Controller\n{\n    \u002F**\n     * @var TymonJWTAuthJWTAuth\n     *\u002F\n    protected $jwt;\n    public function __construct(JWTAuth $jwt)\n    {\n        $this-&gt;jwt = $jwt;\n    }\n    public function loginPost(Request $request)\n    {\n        $this-&gt;validate($request, [\n            'email'    =&gt; 'required|email|max:255',\n            'password' =&gt; 'required',\n        ]);\n        try {\n            if (! $token = $this-&gt;jwt-&gt;attempt($request-&gt;only('email', 'password'))) {\n                return response()-&gt;json(['user_not_found'], 404);\n            }\n        } catch (TokenExpiredException $e) {\n            return response()-&gt;json(['token_expired'], $e-&gt;getStatusCode());\n        } catch (TokenInvalidException $e) {\n            return response()-&gt;json(['token_invalid'], $e-&gt;getStatusCode());\n        } catch (JWTException $e) {\n            return response()-&gt;json(['token_absent' =&gt; $e-&gt;getMessage()], $e-&gt;getStatusCode());\n        }\n        return response()-&gt;json(compact('token'));\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Setelah itu tambahkan sebuah routes baru di web.php\u003C\u002Fp>\u003Cpre>\u003Ccode>$app-&gt;post('\u002Fauth\u002Flogin', 'AuthController@loginPost');\u003C\u002Fcode>\u003C\u002Fpre>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cfigure>\u003Cimg alt=\"\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Jadi user yang ingin mengakses api, harus generate token dulu dengan mengakses route di atas. \u003C\u002Fp>Rekomendasi:  Membuat REST API dengan Lumen #part 1\u003Cp>Kita coba generate token lewat postman.\u003C\u002Fp>\u003Cfigure>\u003Cimg alt=\"Generate token\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Nah sekarang kita sudah dapet token, selanjutnya kita bisa menggunakan token tersebut untuk mengakses route yang terproteksi tadi, seperti contoh di bawah ini.\u003C\u002Fp>\u003Cfigure>\u003Cimg alt=\"product api\" src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Ffigure>\u003Cp>Kita harus menambahkan header baru dengan nama Authorization dengan value bearer token_kamu\u003C\u002Fp>\u003Cp>Nah di implementasi pada real project, token ini bisa kamu simpan di local storage browser atau pada device smartphone kamu jadi bisa digunakan berulang kali.\u003C\u002Fp>\u003Cp>Jadi itulah pemanfaatan Jwt Auth untuk salah satu cara mengamankan rest api yang kamu buat.\u003C\u002Fp>Please follow and like us:\u003Ca href=\"http:\u002F\u002Fwww.specificfeeds.com\u002Fwidgets\u002FemailSubscribeEncFeed\u002FUmN5cWduWHlmN09VS1JQcFMrLzFJODRBMlMxY3R4RWlzQnFqb2REQlVwRWxodzRTT3NLYTNxQ2FUbzFvSkJTM2hFMU9SOVdWdGNiSlF0N3ZFMjdqR1A0U2VoL0tFYXdjb1JOUnRldUlqd2ZHYU84K2lvQXZ4aHNXQ3hYZ2g2N018RlF5OExKZXdlaW1QWllodDc3c3ZscmliQ1pDaTFBSFdTWUQ3MElieVNIST0=\u002FOA==\u002F\">\u003Cimg src=\"data:image\u002Fgif;base64,R0lGODlhAQABAIAAAAAAAP\u002F\u002F\u002FyH5BAEAAAAALAAAAAABAAEAAAIBRAA7\"\u002F>\u003C\u002Fa>\u003Ca href=\"http:\u002F\u002Ftwitter.com\u002Fshare\">\u003C\u002Fa>\u003Ca href=\"https:\u002F\u002Fwww.pinterest.com\u002Fpin\u002Fcreate\u002Fbutton\u002F?url=&amp;media=&amp;description=\">\u003C\u002Fa> Tags: jwt auth lumen rest","Agus Yusida October 21, 2018 Melanjutkan part 1 sebelumnya tentang membuat rest api dengan lumen, kali ini kita akan melanjutkan rest api sebelumnya dengan mena",[],[],0]