🔒
CognitoでIAM Identity Center(旧SSO)のアカウントを利用する(Amplify)
AmplifyのAuthメソッドをオーバーライドします。
amplify override auth
作成されたoverride.ts
を下記のように変更します。
override.ts
import { AmplifyAuthCognitoStackTemplate } from "@aws-amplify/cli-extensibility-helper";
export function override(resources: AmplifyAuthCognitoStackTemplate) {
resources.addCfnResource(
{
type: "AWS::Cognito::UserPoolIdentityProvider",
properties: {
ProviderName: "AWSSSO",
ProviderType: "SAML",
UserPoolId: resources.userPool.ref,
AttributeMapping: {
email:
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress",
},
ProviderDetails: {
MetadataURL:
"IAM Identity CenterのメタデータURL",
},
},
},
"SAML"
);
resources.addCfnResource(
{
type: "AWS::Cognito::UserPoolDomain",
properties: {
Domain: "ユーザープールに設定したいドメイン名(末尾に.auth.<リージョン名>.amazoncognito.comが付与されます。)",
UserPoolId: resources.userPool.ref,
},
},
"UserPoolDomain"
);
resources.userPoolClientWeb.callbackUrLs = [
"Amplifyのドメイン(サインインページのパス)",
];
resources.userPoolClientWeb.logoutUrLs = [
"Amplifyのドメイン(サインアウトページのパス)",
];
resources.userPoolClientWeb.supportedIdentityProviders = ["AWSSSO"];
resources.userPoolClientWeb.allowedOAuthFlows = ["code"];
resources.userPoolClientWeb.allowedOAuthFlowsUserPoolClient = true;
resources.userPoolClientWeb.allowedOAuthScopes = [
"openid",
"email",
"phone",
"aws.cognito.signin.user.admin",
"profile",
];
}
変更したら、一度プッシュ
amplify push
オーバーライドに成功したらフロントエンドの aws-exports.js
を読み込みするコードに oauth の設定を追記します。
import { Amplify } from "aws-amplify";
import awsconfig from "../aws-exports";
Amplify.configure({
...awsconfig,
oauth: {
domain:
"ユーザープールのドメイン(******.auth.<リージョン名>.amazoncognito.com)",
scope: [
"phone",
"email",
"openid",
"profile",
"aws.cognito.signin.user.admin",
],
redirectSignIn: "Amplifyのドメイン(サインインページのパス)",
redirectSignOut: "Amplifyのドメイン(サインアウトページのパス)",
responseType: "code",
},
});
_app.js
import "@/styles/globals.css";
import React, { useEffect, useState } from "react";
import { Amplify, Auth } from "aws-amplify";
import awsconfig from "../aws-exports";
Amplify.configure({
...awsconfig,
oauth: {
domain:
"ユーザープールのドメイン(******.auth.<リージョン名>.amazoncognito.com)",
scope: [
"phone",
"email",
"openid",
"profile",
"aws.cognito.signin.user.admin",
],
redirectSignIn: "Amplifyのドメイン(サインインページのパス)",
redirectSignOut: "Amplifyのドメイン(サインアウトページのパス)",
responseType: "code",
},
});
export default function App({ Component, pageProps }) {
const [authenticated, setAuthenticated] = useState(false);
useEffect(() => {
checkUser();
}, []);
const checkUser = async () => {
try {
await Auth.currentSession();
console.log("user is authenticated");
setAuthenticated(true);
} catch (error) {
console.log("user is not authenticated");
setAuthenticated(false);
Auth.federatedSignIn(); // AWS SSOのログインページにリダイレクトする
}
};
return (
<div>{authenticated && <Component {...pageProps} />}</div>
);
}
これで画面を確認してみてください。
npm run dev
Discussion