
Cognito + Google OAuthã§è©°ãŸã3ã€ã®çœ |ãã³ããŒãããã£ã解決ç
ã¯ããã«
Cognito(AWS)ã«Googleãã°ã€ã³ã飿ºããæ¡ä»¶ã§ããã³ããŒã3ã€ã®çœ ãå šéšèžã¿æãã話ã§ãã
ECãµã€ãã«äŒå¡æ©èœ(SSO)ãå®è£ ããæã«çºçããè©°ãŸããã€ã³ããªãã§ãããå ¬åŒããã¥ã¡ã³ãéããã£ãŠãã®ã«åããªãã£ãŠããããããããã¿ãŒã³ã
ããã£ãŠãäººã®æ€çŽ¢ã§ãã®èšäºã«èŸ¿ãçããŠããããå¬ããã®ã§ã解決çãå ±æããŸãã

æ§æã®åæ
å®è£ ããæ§æã¯ãã£ãã以äž:
[ãŠãŒã¶ãŒ]
â
[CloudFront(AWS) (+ CloudFront Functions)]
â
[S3(AWS) (éçãã¹ãã£ã³ã°)]
â ãã°ã€ã³ãã¿ã³æŒäž
[Cognito Hosted UI]
â Continue with Google
[Google OAuth 2.0]
â èªå¯ã³ãŒãè¿åŽ
[ãµã€ã:PKCE ã§ããŒã¯ã³äº€æ]
â
[ãã°ã€ã³å®äº]ECãµã€ãã CloudFront + S3 ã§é
ä¿¡ããŠãäŒå¡æ©èœã¯ Cognito ã§ Google ãã§ãã¬ãŒã·ã§ã³ã
ããããæ§æã§ãã
ð¢ çœ ãã®1:Cognitoã® "name" 屿§ã空ã«ãªã
äœãèµ·ãã?
ãŠãŒã¶ãŒã Google ãã°ã€ã³ãå®äºããç¬éã«ãCognito åŽã§ãšã©ãŒ:
attributes required: [name]ãname屿§ãå¿ é ãªã®ã«ç©ºã§ãããšåŒŸãããã
èšå®ã¯åé¡ãªãã¯ã
Google IdP ã®å±æ§ãããã³ã°ãèŠããš:
| Cognito屿§ | â | Google屿§ |
|-----------|---|----------|
| email | â | email |
| name | â | name |
å ¬åŒããã¥ã¡ã³ãéãã« `name â name` ã§èšå®æžã¿ãäœãééã£ãŠãªãã
åå
Google ãè¿ã Open ID Connect(以é:OIDC)ã¬ã¹ãã³ã¹ã«ãname(ãã«ããŒã )ãå«ãŸããªãã±ãŒã¹ããããã§ãã
çç±ã¯è²ã :
ãŠãŒã¶ãŒã Google ã¢ã«ãŠã³ãã§æ¬åãéå ¬éèšå®
Workspace ã¢ã«ãŠã³ãã§ç®¡çè ããã«ããŒã 衚瀺ãå¶éããŠã
ããã¯ããŒã ã®ã¿ç»é²ã®äºº
â ã€ãŸããGoogleã®ä»æ§äžãname ã¯å¿ ãè¿ãä¿èšŒããªãã
ãããªã®ã« Cognito User Pool åŽã¯ `name` ãå¿ é 屿§ã«ããŠããäœæåŸã¯å€æŽäžå¯ãªã®ã§ããããè©°ãŸãã

ð 解決ç
屿§ãããã³ã°ã倿Ž:
| Cognito屿§ | â | Google屿§ |
|-----------|---|----------|
| name | â | given_name |
`given_name`(åã®ã¿)ã¯ãGoogle åŽã§å¿ ãè¿ããã£ãŒã«ãã
å§ã»åã®ãã«ããŒã ãããªããªããã©ã確å®ã«åãã
åŠã³
OIDC ã®ãæšæºä»æ§ããšãå®è£ ã®æåãã¯ä¹é¢ããã
ç¹ã«ãã§ãã¬ãŒã·ã§ã³(Googleã»Facebookã»Appleç)ã䜿ãå Žåã¯:
name(ãã«ããŒã )ã«äŸåããªã
given_name / family_name(åå¥ãã£ãŒã«ã)ãžãã©ãŒã«ããã¯èšèš
å¿ é 屿§ã¯æå°éã«ãã(åŸã§è¿œå ã§ããªããã)
ð¢ çœ ãã®2:CloudFront Functions JS-2.0 ã§ set-cookie 仿§ãå€ãã£ãŠã
äœãèµ·ãã?
CloudFront Functions ã§èªèšŒCookieãçºè¡ããåŠçãå®è£
ã
ã¬ã¹ãã³ã¹ããããŒã« `set-cookie` ãå
¥ããŠè¿ãããããšã©ãŒ:
The CloudFront function returned an invalid value:
response.headers cannot contain 'set-cookie' header.
Use response.cookies instead.
(MisplacedCookies)ãset-cookie ããããŒã¯äœ¿ããªãresponse.cookies ã䜿ãããšåŒŸãããã
ã§ãæã®ãµã³ãã«ã§ã¯åããŠã
CloudFront Functions ã®å€ãæ å ±ããããã§èª¿ã¹ããšãset-cookie ããããŒã§æžããŠãã³ãŒãããã£ã±ãåºãŠããã
// æã®ããæ¹(JS-1.0)
return {
statusCode: 302,
headers: {
'location': { value: '/' },
'set-cookie': { value: 'munchie_unlock=valid; Path=/; ...' }
}
};â ããã ãš MisplacedCookies ãšã©ãŒã
åå
CloudFront Functions ã®ã©ã³ã¿ã€ã ã JS-1.0 â JS-2.0 ã§ä»æ§å€æŽãããŠãã

| ããŒãžã§ã³ | Cookie ã®æž¡ãæ¹ |
|---------|--------------|
| JS-1.0 | `headers['set-cookie']` ã§OK |
| JS-2.0 | `cookies` ãã£ãŒã«ãã«åé¢ã`set-cookie` ããããŒã¯çŠæ¢ |
ð 解決ç
`response.cookies` ã®ç¬ç«ãã£ãŒã«ãã§æžã:
// æ°ããããæ¹(JS-2.0)
return {
statusCode: 302,
headers: {
'location': { value: '/' }
},
cookies: {
'munchie_unlock': {
value: 'valid',
attributes: 'Path=/; Max-Age=2592000; Secure; HttpOnly; SameSite=Lax'
}
}
};â ããã§ãšã©ãŒè§£æ¶ã
åŠã³
æ°ã©ã³ã¿ã€ã ã䜿ãæã¯ãªãªãŒã¹ããŒã確èªãå¿ é ã
ç¹ã« AWS ã®ãµãŒããŒã¬ã¹ç³»ã¯ãããŒãžã§ã³éãã§ä»æ§ãç Žå£çã«å€ããããšãããã
`MisplacedCookies` ãšãããšã©ãŒã¡ãã»ãŒãžã§æ€çŽ¢ãããäžçºã§åå ç¹å®ã§ããã®ã§ããšã©ãŒã¡ãã»ãŒãžã¯ãã®ãŸãŸ Google ã«æããã®ãæéã«ãŒãã
ð¢ çœ ãã®3:OAuthã³ãŒã«ãã㯠URL ã®ã¹ã©ãã·ã¥äžäžèŽ
äœãèµ·ãã?
Cognito Hosted UI ã§ Google ãã°ã€ã³ãå®äº â ãªãã€ã¬ã¯ãåŠçãåããªãã
URL ã« `?code=xxx` ã®èªå¯ã³ãŒããä»ããªãã
Cognito åŽã®ç»é²URL
https://xxx.cloudfront.netæ«å°Ÿã¹ã©ãã·ã¥ãªãã§ç»é²ã
JS åŽã® redirect_uri
const redirectUri = window.location.origin + window.location.pathname;
// â "https://xxx.cloudfront.net/"æ«å°Ÿã¹ã©ãã·ã¥ããã«ãªã(CloudFront ã®ããã©ã«ããã¡ã€ã³ããããªã£ãŠããã)ã
åå
OAuth 2.0 ã®ä»æ§äžãredirect_uri ã¯å®å šäžèŽãèŠæ±ããã
| å Žæ | URL |
|----|-----|
| Cognitoç»é² | `https://xxx.cloudfront.net` |
| JSçæ | `https://xxx.cloudfront.net/` â æ«å°Ÿã¹ã©ãã·ã¥ |
â 1æåéãã§èªèšŒå€±æã

ããããšã©ãŒã¡ãã»ãŒãžãåºãªãã±ãŒã¹ãããã®ã§ãåå ç¹å®ã«æéããã£ãã
ð 解決ç
Cognito ã®èš±å¯ã³ãŒã«ãã㯠URLã«ãäž¡æ¹ã®è¡šèšãç»é²:
https://xxx.cloudfront.net
https://xxx.cloudfront.net/â ã©ã£ã¡ã§æ¥ãŠãéãã
åŠã³
OAuth 2.0 ã®URIãããã³ã°ã¯å³å¯ã
ç¹ã« CloudFront ã®ããã©ã«ããã¡ã€ã³(`*.cloudfront.net`)ã¯æ«å°Ÿã¹ã©ãã·ã¥ä»ãã§ã¢ã¯ã»ã¹ãããæåãªã®ã§ãã¹ã©ãã·ã¥ãã/ãªãäž¡æ¹ãèš±å¯URLã«ç»é²ããŠããã®ãå®å šã§ããã«ã¹ã¿ã ãã¡ã€ã³ã䜿ãå Žåãããã¹ä»ãURLã§ããåãçœ ãçºçããŸãã
ãŸãšã
Cognito ãš Google OAuth 飿ºã§èžãã çœ ãšå¯Ÿç:
| çœ | åå | 察ç |
|----|------|------|
| 1. name屿§ã空ã§ãšã©ãŒ | Googleã name ãè¿ããªãã±ãŒã¹ãã | `given_name` ã«ãããã³ã°å€æŽ |
| 2. set-cookie ããããŒçŠæ¢ | CloudFront Functions JS-2.0 仿§ | `response.cookies` ã«åé¢ |
| 3. redirect_uri äžäžèŽ | ã¹ã©ãã·ã¥1æåã®å·® | äž¡æ¹ã®è¡šèšãç»é² |
æèš
å ¬åŒããã¥ã¡ã³ãéãèšå®ããŠãã仿§å€ã®æåã§è©°ãŸãããšã¯ããã
ç¹ã«ãã§ãã¬ãŒã·ã§ã³èªèšŒã¯:
IdP(Googleç)ã®æåãæšæºä»æ§ãšä¹é¢
AWSãµãŒãã¹ã®ã©ã³ã¿ã€ã ããŒãžã§ã³ã§ä»æ§å€æŽ
URIå®å šäžèŽã®çœ
ãšã©ãŒã¡ãã»ãŒãžããã®ãŸãŸæ€çŽ¢ããã®ããè§£æ±ºã®æçã«ãŒãã§ããã
ããã®èšäºãè峿·±ãã£ãæ¹ã¯ã以äžèšäºãããããã§ãã
ïŒããããèšäºâ ïŒ
ãã®èšäºã®Cognitoãåå°ã«ãAWSã§SSOèªèšŒåºç€ãå人éçºãã話ã¯ãã¡ãã
ïŒããããèšäºâ¡ïŒ
CloudFront Functionsã§èªèšŒãè»œãæžãŸãããJSãã¹ã³ãŒãã®æå°æ§æãç¥ãããæ¹ã¯ãã¡ãã
ïŒããããèšäºâ¢ïŒ
åãCognitoã«ãã¢ããªããšã«ONã»OFFã§ããäºæ®µéèªèšŒãè¶³ãã話ã¯ãã¡ãã