Amplify SDKで、ログイン中ユーザーのCognito User PoolsでのGroupを取得する #AWSAmplifyJP
Cognito User Poolsでは、ユーザーをグループ分けすることができます。が、AmplifyまたはCognito User PoolsのSDKにはGroupを取得するメソッド・APIが用意されていません。 その […]
目次
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に置き換えれば、「この先管理者のみアクセス可能」のような実装も可能です。たぶん。