メむンコンテンツぞスキップ
芋出し画像

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できる二段階認蚌を足した話はこちら。


     
     
    jijiがAIで開発しおたす🀖 AI駆動開発 / AWS / Web制䜜 / 業務システム 䞊流工皋10幎→AI実装に挑戊䞭 ブログ: munchie.jp

    あなたぞのおすすめ