{"blog_title":"sinokuno\u2019s diary","description":"\u52d5\u4f5c\u5206\u6790\u30b7\u30b9\u30c6\u30e0 MFA\u5c0e\u5165\u624b\u9806\u66f8\uff08Cognito + Angular + Django\uff09 1. \u76ee\u7684 \u672c\u624b\u9806\u66f8\u3067\u306f\u3001\u65e2\u5b58\u306eRedmine\u8a8d\u8a3c\u3092\u5ec3\u6b62\u3057\u3001AWS Cognito \u3092\u4f7f\u7528\u3057\u305f\u591a\u8981\u7d20\u8a8d\u8a3c\uff08MFA\uff09\u3078\u79fb\u884c\u3059\u308b\u3002 \u5bfe\u8c61\u30b7\u30b9\u30c6\u30e0\uff1a \u30d5\u30ed\u30f3\u30c8\u30a8\u30f3\u30c9\uff1aAngular API\uff1aDjango REST Framework DB\uff1aAmazon RDS MySQL \u5b9f\u884c\u57fa\u76e4\uff1aEC2 + Docker \u30b3\u30f3\u30c6\u30ca\u7ba1\u7406\uff1aECR \u5c0e\u5165\u5f8c\u306e\u8a8d\u8a3c\u65b9\u5f0f\uff1a Cognito Hosted UI MFA\uff08TOTP\uff09 JWT\u8a8d\u8a3c Bearer Token\u8a8d\u8a3c 2. \u30b7\u30b9\u30c6\u30e0\u69cb\u6210 @startuml actor User r\u2026","author_name":"sinokuno","title":"\u52d5\u4f5c\u5206\u6790\u30b7\u30b9\u30c6\u30e0 MFA\u5c0e\u5165\u624b\u9806\u66f8\uff08Cognito + Angular + Django\uff09","width":"100%","version":"1.0","published":"2026-06-14 13:02:12","categories":[],"url":"https://sinokuno.hatenablog.com/entry/2026/06/14/130212","height":"190","provider_url":"https://hatena.blog","author_url":"https://blog.hatena.ne.jp/sinokuno/","html":"<iframe src=\"https://hatenablog-parts.com/embed?url=https%3A%2F%2Fsinokuno.hatenablog.com%2Fentry%2F2026%2F06%2F14%2F130212\" title=\"\u52d5\u4f5c\u5206\u6790\u30b7\u30b9\u30c6\u30e0 MFA\u5c0e\u5165\u624b\u9806\u66f8\uff08Cognito + Angular + Django\uff09 - sinokuno\u2019s diary\" class=\"embed-card embed-blogcard\" scrolling=\"no\" frameborder=\"0\" style=\"display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;\"></iframe>","type":"rich","blog_url":"https://sinokuno.hatenablog.com/","image_url":null,"provider_name":"Hatena Blog"}