Laravel縺ァ Amazon Cognito 繝ュ繧ー繧、繝ウ隱崎ィシ2縲蝉シ壼藤逋サ骭イ讖溯ス縲
蜑榊屓縺ッLaravel繧偵吶シ繧ケ縺ォAmazon Cognito縺ィ騾」謳コ縺励◆繝ュ繧ー繧、繝ウ隱崎ィシ繧貞ョ溯」縺励,ognito蛛エ縺ョ險ュ螳壹b陦後>縺セ縺励◆縲
莉雁屓縺ッLaravel蛛エ縺ョ莨壼藤逋サ骭イ繝壹シ繧ク縺九iAmazon Cognito縺ク莨壼藤逋サ骭イ縺吶k讖溯ス繧貞ョ溯」縺励∪縺吶

莨壼藤逋サ骭イ譎ゅョ讀懆ィシ繧ソ繧、繝怜、画峩
繝繝輔か繝ォ繝医〒縺ッ繧ウ繝シ繝峨r蜈・蜉帙&縺帙k繧ソ繧、繝励ョ險ュ螳壹↓縺ェ縺」縺ヲ縺縺セ縺吶
縺薙ョ縺セ縺セ縺縺ィ繝ヲ繝シ繧カ蛛エ縺ョ謇矩俣縺悟ー代@蠅励∴縺セ縺吶ョ縺ァ縲√Μ繝ウ繧ッ繧ソ繧、繝励↓螟画峩縺励※縺翫″縺セ縺吶
險ュ螳壹ッCognito邂。逅繧ウ繝ウ繧ス繝シ繝ォ縺ョ荳玖ィ倬Κ蛻縺ァ縺吶
蜈ィ闊ャ險ュ螳->繝。繝繧サ繝シ繧ク縺ョ繧ォ繧ケ繧ソ繝槭う繧コ->E繝。繝シ繝ォ讀懆ィシ繝。繝繧サ繝シ繧ク繧ォ繧ケ繧ソ繝槭う繧コ

莨壼藤逋サ骭イ讒狗ッ峨ョ豬√l
繝ュ繧ー繧、繝ウ讖溯ス讒狗ッ画凾縺ィ蜷梧ァ倥↓縲√吶シ繧ケ縺ッLaravel隱崎ィシ讖溯ス繧貞茜逕ィ縺励∪縺吶
| 1 | 莨壼藤逋サ骭イ逕サ髱「縺ョ繝舌Μ繝繝シ繧キ繝ァ繝ウ繝√ぉ繝繧ッ霑ス蜉 | 繝サ繝代せ繝ッ繝シ繝峨昴Μ繧キ繝シ繧辰ognito縺ォ蜷医o縺帙k 繝サConigot蛛エ縺ョ莨壼藤驥崎、繝√ぉ繝繧ッ繧定。後≧ |
| 2 | RegisterController縺ォCognitoAPI繧偵さ繝シ繝ォ縺吶k蜃ヲ逅繧定ソス蜉 | 繝サCognitoClient縺ョ貅門y |
| 3 | Cognito縺ョ莨壼藤逋サ骭イAPI繧貞ョ溯。 | 繝サ莨壼藤逋サ骭イ蜃ヲ逅譎ゅ↓signUp API繧貞ョ溯。 |
| 4 | Laravel蛛エ縺ョ莨壼藤逋サ骭イ繧ょョ溯。 | 繝サCognito蛛エ縺ョ莨壼藤逋サ骭イ蜃ヲ逅縺梧仙粥縺励◆繧峨´aravel縺ォ繧ゆシ壼藤繧剃ス懈 |
莨壼藤逋サ骭イ逕サ髱「縺ョ繝舌Μ繝繝シ繧キ繝ァ繝ウ繝√ぉ繝繧ッ霑ス蜉
蠢隕√↑菴懈・ュ縺ッ荳玖ィ倥ョシ偵▽縺ォ縺ェ繧翫∪縺吶
- 繝代せ繝ッ繝シ繝峨昴Μ繧キ繝シ繧辰ognito縺ォ蜷医o縺帙k
- Cognito蛛エ縺ョ莨壼藤驥崎、繝√ぉ繝繧ッ繧定。後≧
繝代せ繝ッ繝シ繝峨昴Μ繧キ繝シ繧辰ognito縺ォ蜷医o縺帙k
Cognito縺ョ繝代せ繝ッ繝シ繝峨昴Μ繧キ繝シ縺ッ荳玖ィ倥ョ騾壹j縺ァ縺吶
Amazon Cognito縺ョ繝代せ繝ッ繝シ繝峨昴Μ繧キ繝シ
蛻縺九j縺・繧峨>縺ョ縺ァ縺吶′縲∬ヲ∫エ縺吶k縺ィ荳玖ィ倥〒縺吶
- 闍ア謨ー蟄励r蜷ォ繧
- 螟ァ譁蟄励→蟆乗枚蟄励r縺昴l縺槭l蜷ォ繧
- 險伜捷繧貞性繧
縺薙l繧呈ュ」隕剰。ィ迴セ縺ァ繝代せ繝ッ繝シ繝峨ョ蜈・蜉帙メ繧ァ繝繧ッ縺ォ蜉縺医∪縺吶
protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'password' => ['required', 'string', 'min:8', 'confirmed',
'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[\^$*.\[\]{}\(\)?\-\"!@#%&\/,><\':;|_~`])\S{8,99}$/'],
]);
}
縺薙l縺ァ繝代せ繝ッ繝シ繝峨ョ蜈・蜉帙メ繧ァ繝繧ッ縺ッ螳御コ縺ァ縺吶
Cognito縺ョ莨壼藤驥崎、繝√ぉ繝繧ッ繧定。後≧
Laravel縺ィCognito縺ョ莨壼藤迥カ諷九ッ蜷梧悄縺励※縺繧九%縺ィ縺悟茜逕ィ縺ァ縺吶′縲∽ス輔°縺ョ荳榊キ蜷医〒荳肴紛蜷医′逋コ逕溘@縺ヲ縺繧句庄閭ス諤ァ繧り縺医i繧後∪縺吶
Laravel蛛エ縺ョ莨壼藤驥崎、繝√ぉ繝繧ッ縺ッ繝。繝シ繝ォ繧「繝峨Ξ繧ケ繧偵吶シ繧ケ縺ォ螳滓命縺輔l縺ヲ縺縺セ縺吶ョ縺ァ縲,ognito蛛エ繧ょ酔縺倥h縺縺ォ繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ァ驥崎、繝√ぉ繝繧ッ繧定。後>縺セ縺吶
縺セ縺壹ッ繧ォ繧ケ繧ソ繝繝ォ繝シ繝ォ縺ョ貅門y
php artisan make:rule CognitoUserUnique
螳溯」縺ッ荳玖ィ倥ョ騾壹j縺ァ縺吶
<?php
namespace App\Rules;
use App\Cognito\CognitoClient;
use Aws\CognitoIdentityProvider\CognitoIdentityProviderClient;
use Illuminate\Contracts\Validation\Rule;
class CognitoUserUnique implements Rule
{
/**
* Create a new rule instance.
*
* @return void
*/
protected $config;
public function __construct()
{
$this->config = [
'region' => config('cognito.region'),
'version' => config('cognito.version')
];
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
$client = new CognitoClient(
new CognitoIdentityProviderClient($this->config)
);
$user = $client->getUserByUsername($value);
if($user){
return false;
}
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return '縺薙ョ繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ッCognito縺ォ縺吶〒縺ォ逋サ骭イ縺輔l縺ヲ縺縺セ縺吶';
}
}
CognitoClient縺ォgetUserByUsername繝。繧ス繝繝峨r菴懈舌@莨壼藤繧貞叙蠕励@縺セ縺吶
蜿門セ怜コ譚・縺溘i驥崎、縺励※縺繧九ョ縺ァfalseシ医ヰ繝ェ繝繝シ繧キ繝ァ繝ウNGシ峨r霑泌唆縺励∝叙蠕励〒縺阪↑縺代l縺ーtrueシ医ヰ繝ェ繝繝シ繧キ繝ァ繝ウOKシ峨r霑泌唆縺励∪縺吶
getUserByUsername繝。繧ス繝繝峨ッ縺ゅ→縺ァ貅門y縺励∪縺吶
Controller縺ァCognito莨壼藤逋サ骭イ蜻シ縺ウ蜃コ縺
RegisterController縺ァ縺ッ縲√ヰ繝ェ繝繝シ繧キ繝ァ繝ウ繝√ぉ繝繧ッ縺悟ョ御コ縺励◆繧営reate繝。繧ス繝繝峨′蜻シ縺ー繧御シ壼藤逋サ骭イ蜃ヲ逅縺悟ョ溯。後&繧後∪縺吶
縺薙%縺ォCognito縺ョ莨壼藤逋サ骭イAPI繧貞他縺ウ蜃コ縺吝ヲ逅繧定ソス蜉縺励∪縺吶
protected function create(array $data)
{
$config = [
'region' => config('cognito.region'),
'version' => config('cognito.version')
];
$client = new CognitoClient(
new CognitoIdentityProviderClient($config)
);
$client->createUser($data['email'],$data['password'],[]);
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => '',
]);
}
縺薙%縺ァ繧CognitoClinet繧剃スソ縺」縺ヲ縲…reateUser繝。繧ス繝繝峨r蜻シ縺ウ蜃コ縺励※縺縺セ縺吶
createUser繝。繧ス繝繝峨b縺ゅ→縺ァ菴懈舌@縺セ縺吶
Cognito蛛エ縺ョ莨壼藤逋サ骭イ縺悟撫鬘後↑縺冗オゅo繧後ー縲´aravel蛛エ縺ョUser::create蜃ヲ逅繧貞ョ溯。後@縺ヲ縺縺セ縺吶
Laravel蛛エ縺ォ縺ッ繝代せ繝ッ繝シ繝峨ッ荳崎ヲ√↓縺ェ繧九ョ縺ァ縲∫ゥコ縺ァ逋サ骭イ縺吶k繧医≧縺ォ螟画峩縺励※縺縺セ縺吶ゅ◎縺ョ縺セ縺セ蜈・繧後※縺縺ヲ繧ら音縺ォ蝠城。後ッ縺斐*縺縺セ縺帙s縲
Cognito縺ョ莨壼藤逋サ骭イAPI螳溯。
CognitoClient縺ォ菴懈舌′蠢隕√↑繝。繧ス繝繝峨ッシ偵▽縺ォ縺ェ繧翫∪縺吶
- createUser
- getUserByUsername
蜑榊屓菴懈舌@縺櫃ognitoClient縺ォ讖溯ス繧定ソス蜉縺励※縺縺阪∪縺吶
public function createUser($email,$password,$attributes){
try
{
$response = $this->client->signUp([
'ClientId' => $this->clientId,
'Password' => $password,
'SecretHash' => $this->getSecretHash($email),
'UserAttributes' => $this->formatAttributes($attributes),
'Username' => $email
]);
} catch (CognitoIdentityProviderException $e) {
if($e->getAwsErrorCode() === 'InvalidPasswordException'){
throw new Exception('繝代せ繝ッ繝シ繝峨ョ蠖「蠑上′豁」縺励¥縺ゅj縺セ縺帙s縲');
}
if($e->getAwsErrorCode() === 'UsernameExistsException'){
throw new Exception('繝。繝シ繝ォ繧「繝峨Ξ繧ケ縺ッ縺吶〒縺ォ逋サ骭イ縺輔l縺ヲ縺縺セ縺吶');
}
throw $e;
}
return $response['UserSub'];
}
private function getSecretHash($username)
{
$hash = hash_hmac(
'sha256',
$username.$this->clientId,
$this->client_secret,
true
);
return base64_encode($hash);
}
private function formatAttributes(array $attributes)
{
$userAttributes = [];
foreach ($attributes as $key => $value) {
$userAttributes[] = [
'Name' => $key,
'Value' => $value,
];
}
return $userAttributes;
}
繝ェ繝輔ぃ繝ャ繝ウ繧ケ縺ォ蠕薙>繝ェ繧ッ繧ィ繧ケ繝医ヱ繝ゥ繝。繝シ繧ソ繧定ィュ螳壹@縺セ縺吶4ecretHash縺ィ縺縺繝上ャ繧キ繝・蛟、繧ょソ鬆医↓縺ェ縺」縺ヲ縺翫j縺セ縺吶ョ縺ァ縲SecretHash 蛟、縺ョ險育ョ繧定ェュ繧薙〒螳溯」縺励∪縺吶
繧ィ繝ゥ繝シ縺檎匱逕溘@縺溷エ蜷医ッCognitoIdentityProviderException縺瑚ソ泌唆縺輔l縺セ縺吶
隗」隱ャ縺ョ縺溘a縺ォ縲栗nvalidPasswordException縲阪→縲袈sernameExistsException縲阪□縺代く繝」繝繝√@縺ヲ繝。繝繧サ繝シ繧ク繧定ィ倩シ峨@縺ヲ縺縺セ縺吶
莉悶↓繧りソ泌唆縺輔l繧九お繝ゥ繝シ繧ウ繝シ繝峨ッ縺ゅj縺セ縺吶ョ縺ァ縲∝ャ蠑上し繧、繝医ョ隗」隱ャ繧堤「コ隱阪@縺ェ縺後i蠢隕√↑蜃ヲ逅繧貞ョ溯」縺励∪縺励g縺縲
public function getUserByUsername($username)
{
try {
$user = $this->client->adminGetUser([
'Username' => $username,
'UserPoolId' => $this->poolId,
]);
} catch (CognitoIdentityProviderException $e) {
return false;
}
return $user;
}
莨壼藤諠蝣ア縺ョ蜿門セ励↓縺ッadminGetUser縺ィ縺縺API繧貞茜逕ィ縺励∪縺吶
繝。繝シ繝ォ繧「繝峨Ξ繧ケ讀懆ィシ
Laravel縺ョ莨壼藤逋サ骭イ逕サ髱「繧貞茜逕ィ縺励※繧ゅ″縺。繧薙→繝。繝シ繝ォ繧「繝峨Ξ繧ケ隱崎ィシ讖溯ス縺ッ螳溯。後&繧後∪縺吶
繝。繝シ繝ォ螳帙↓螻翫>縺溘Μ繝ウ繧ッ繧偵け繝ェ繝繧ッ縺励↑縺縺セ縺セ縺縺ィ縲√Ο繧ー繧、繝ウ縺吶k縺薙→縺ッ縺ァ縺阪∪縺帙s縲

莨壼藤逋サ骭イ譎ゅ↓螻翫>縺溘Γ繝シ繝ォ縺ョ繝ェ繝ウ繧ッ繧偵け繝ェ繝繧ッ縺吶k縺ィ繝ュ繧ー繧、繝ウ縺ァ縺阪k繧医≧縺ォ縺ェ繧翫∪縺吶


繝。繝シ繝ォ繧「繝峨Ξ繧ケ讀懆ィシ逕サ髱「繧り恭隱槭ョ縺セ縺セ繧ォ繧ケ繧ソ繝槭う繧コ縺ァ縺阪↑縺縺ョ縺ァ縲∝挨逕サ髱「縺ォ繝ェ繝繧、繝ャ繧ッ繝医&縺帙k縺ェ縺ゥ蟇セ蠢懊′蠢隕√↓縺ェ繧翫◎縺縺ァ縺吶
縺セ縺ィ繧
莉雁屓縺ッLaravel繧貞茜逕ィ縺励◆Cognito騾」謳コ隨ャ2蠑セ縺ィ縺励※莨壼藤逋サ骭イ讖溯ス繧呈ァ狗ッ峨@縺セ縺励◆縲
Laravel蛛エ縺ォ繝吶シ繧ケ縺ィ縺ェ繧区ゥ溯ス縺梧コ門y縺輔l縺ヲ縺繧九◆繧√,ognito縺ョAPI繧偵さ繝シ繝ォ縺吶k蜃ヲ逅繧貞刈縺医k縺縺代〒縺サ縺ィ繧薙←螳溯」縺ッ螳御コ縺ァ縺吶ュ縲
Cognito繧剃スソ縺医ー繧オ繧、繝磯俣縺ョSSO繧らー。蜊倥↓螳溽樟縺吶k縺薙→縺後〒縺阪∪縺吶


