SPAサイトなので認証機能はlaravelのapi作成機能を利用して実装しようとしています。laravel passportなども良いかもしれませんが、今回はjwt-authを利用しています。
問題
アクセストークンが取得できない。curlコマンドでクレデンシャルを送ってもunauthorizedになります。
環境
"laravel/framework": "^5.5.0",
"tymon/jwt-auth": "^1.0"
laravelで5.5を使っているのは、jwt-authに6.0用の安定版がないようなので。ただ実際には6.0にしてjwt-auth rc-5版も試してみましたが、アクセストークンの取得ができずでした
laravelでjwt-authを使って、認証機能を実装するとき、以下のようなステップを踏めば良いという認識です。コードを添えておきます。
(1)インストール
$ composer require tymon/jwt-auth:1.0
(2)シークレット生成
php artisan jwt:secret
(3)User モデルに JWTSubjectと二つのメソッド を実装
[app/user.php] <?php namespace App; use Tymon\JWTAuth\Contracts\JWTSubject; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable implements JWTSubject { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', ]; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } }
(4)JWTGuard を使うように設定
[config/auth.php] <?php //デフォルトのガードをapiに 'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], ... //ドライバーはjwtを利用 'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ],
(5)コントローラ作成(apiController)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ApiController extends Controller { //id,pwで認証してtokenを発行 function login(){ $credentials = request(['email', 'password']); //もし認証エラーなら if(!$token = auth('api')->attempt($credentials)){ return response()->json(['error' => 'Unauthorized'], 401); } //OKならtoken発行 return $this->respondWithToken($token); } //自分の情報返す public function me() { return response()->json(auth()->user()); } //token発行(内部利用) protected function respondWithToken($token) { return response()->json([ 'access_token' => $token, 'token_type' => 'bearer', 'expire_in' => auth('api')->factory()->getTTL(), ]); } }
(6)apiルートの作成
[routes/api.php] <?php use Illuminate\Http\Request; Route::middleware('auth:api')->get('/user', function (Request $request) { return $request->user(); }); Route::group(['middleware' => 'guest:api'], function(){ Route::post('/login', 'ApiController@login'); }); Route::group(['middleware' => 'auth:api'], function(){ Route::get('/me', 'ApiController@me'); Route::get('/logout', 'AuthController@logout'); });
curlコマンドで送信
curl -X POST -H "Accept: application/json" -F "email=sugi@yahoo.co.jp" -F "password=shun" http://localhost:8000/api/login | jq
何か思い切りずれてそうですか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。