Laravel + Cognito
2022.4.22
ゴリラーブログ ハイサイゴリラー山川 ブログ
やりたい事
– Laravel標準の認証の代わりにCognitoを使った認証
Cognitoの設定
– ユーザープールの作成
– アプリクライアントの作成
JWTの検証サービスを作成
– firebase/php-jwt
ユーザープールに対応するパブリック JSON Web キー (JWK) をダウンロード
``` private function fetchJWK() { $region = env('AWS_COGNITO_REGION', 'us-east-1'); $userPoolId = env('AWS_COGNITO_USER_POOL_ID'); $url = "https://cognito-idp.{$region}.amazonaws.com/{$userPoolId}/.well-known/jwks.json"; $client = new \GuzzleHttp\Client(); $response = $client->get($url); return json_decode($response->getBody()->getContents(), true) ?: []; } } ```
Userを取得するGuardを作成
Guardインターフェースを実装したクラスを作成
予め登録したusers.cognito_subにてuserを取得する。
``` … public function user() { if ($this->user) { return $this->user; } $jwt = $this->request->bearerToken(); if (!$jwt) { return null; } $decoded = $this->jwt->decode($jwt); if ($decoded) { return $this->userProvider->retrieveByCredentials(['cognito_sub' => $decoded->sub]); } return null; } ```
作成したGuardを使用する設定
上記のGuardをプロバイダーに登録
app/Providers/AuthServiceProvider.php
``` … public function boot() { $this->registerPolicies(); Auth::extend('cognito', function($app, $name, array $config) { return new CognitoGuard( new jwtClass(), $app['request'], Auth::createUserProvider($config['provider']) ); }); } ```
config/auth.php
``` … 'defaults' => [ 'guard' => 'api', 'passwords' => 'users', ], … 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'cognito', 'provider' => 'users', 'hash' => false, ], ], ```
フロントでの呼び出し
– aws-amplify
``` import { Auth } from 'aws-amplify' … async created() { const data = await Auth.currentSession() const token = data.getIdToken().getJwtToken() const authorization = `Bearer ${token}` axios.defaults.headers.common.Authorization = authorization }, ```
後は良しなにapi呼出し
以上