ログイン

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呼出し

 

以上

© 2022 Mountain Gorilla Co., Ltd. 

プライバシーポリシー

%d人のブロガーが「いいね」をつけました。