Amplify SDKで、ログイン中ユーザーのCognito User PoolsでのGroupを取得する #AWSAmplifyJP

Cognito User Poolsでは、ユーザーをグループ分けすることができます。が、AmplifyまたはCognito User PoolsのSDKにはGroupを取得するメソッド・APIが用意されていません。

そのため、Group情報を取得するAPIを別途立ててこれまでは対処していました。

実は取得できたGroup情報

たまたま別件で検索していたときに、ワークアラウンドを紹介しているポストを見つけました。

I originally expected the Cognito JavaScript API to provide a simple property or method to return the list of groups, but instead I concluded that it was buried within a token, and thus had to learn about jwt. Once the Cognito User is established and the session is retrieved, the array of groups is available within the IdToken.

https://stackoverflow.com/questions/41828359/how-do-i-access-the-group-for-a-cognito-user-account

Amplify SDKを使うと、次のような実装で取得できます。

    Auth.currentSession()
      .then(user => {
        const { payload } = user.getIdToken()
        if (payload && payload['cognito:groups'] ) {
          console.log(payload['cognito:groups'])
        }
      })

応用: 特定のグループに所属していないユーザーは強制ログアウトする

以下のようにすることで、administratorsグループに所属していないユーザーは強制ログアウトさせることができます。

  useEffect(() => {
    Auth.currentSession()
      .then(user => {
        const { payload } = user.getIdToken()
        if (!payload || !payload['cognito:groups'] || !payload['cognito:groups'].includes('administrators')) {
          Auth.signOut().
        }
      })
  },[])

Auth.signOutをReact RouterやNext.jsなどのRouterに置き換えれば、「この先管理者のみアクセス可能」のような実装も可能です。たぶん。

Comment