前提・実現したいこと
S3で作成した静的ホスティングサイトで会員専用ページを作成したいのですが、どのようにすればよいでしょうか。
Cognitoで作成したユーザーで以下のようなコードを書いてみたのですが、アクセスすることは叶いませんでした。
cognitoUser.getSession(function(err, result) { if (result) { AWS.config.credentials = new AWS.CognitoIdentityCredentials({ IdentityPoolId: "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", Logins: { "cognito-idp.us-east-1.amazonaws.com/us-east-1_xxxxxxxxx": result.getIdToken().getJwtToken() } }); window.location.href = "https://xxxxxxxxxxxxxxxxxxxxxx.s3.amazonaws.com/private/index.html"; } });
S3のバケットポリシーは以下のように書いています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::xxxxxxxxxxxxxxxxx/*" }, { "Effect": "Deny", "NotPrincipal": { "AWS": "arn:aws:iam::xxxxxxxxxxxx:user/xxxxxxxxxxxxxx" }, "Action": "s3:*", "Resource": "arn:aws:s3:::xxxxxxxxxxxxxxx/private/index.html" } ] }
そもそもアプローチが違うのでしょうか。ご教授いただけるとありがたいです。
> アクセスすることは叶いませんでした
ということですが、そもそも配置したファイル(index.html?)を表示することができていないということでしょうか?
そうです。配置したhtmlやcss、jsファイルなどを読み込むことができないです。
コードの補足になりますが、以下のようにCognitoの認証は通っています。
あとはIAMのロールやS3のバケットポリシーの設定次第だと思うのですが。。。
```
const email = document.getElementById("emailText").value;
const password = document.getElementById("passwordText").value;
const poolData = {
UserPoolId: "us-east-1_xxxxxx",
ClientId: "xxxxxxxxxxxxx"
};
const userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
const authenticationData = {
Username: email,
Password: password
};
const authenticationDetails =
new AmazonCognitoIdentity.AuthenticationDetails(authenticationData);
const userData = {
Username: email,
Pool: userPool,
};
const cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
cognitoUser.authenticateUser(authenticationDetails, {
onSuccess: function(result) {
const idToken = result.getIdToken().getJwtToken(); // IDトークン
const accessToken = result.getAccessToken().getJwtToken(); // アクセストークン
const refreshToken = result.getRefreshToken().getToken(); // 更新トークン
},
onFailure: function(err) {
console.error(err);
},
});
}
```