繁体   English   中英

Amplify w/Cognito:如何获取当前用户的 Email?

[英]Amplify w/Cognito: How do I get the Current User's Email?

我正在使用 AWS Amplify,并使用 Cognito 进行用户身份验证。

用户go进入用户池,使用email地址和密码注册登录。

当通过 Cognito 登录的用户导航到某个页面时,我想检索他们的 email 地址。 我怎样才能做到这一点?

我可以使用此代码检索一些用户数据(我使用的是 javascript/Angular):

import Auth from '@aws-amplify/auth';
...

ngOnInit(){
  Auth.currentAuthenticatedUser().then((user)=>{
        console.log('user = ' + JSON.stringify(user.pool))      
 })
}

email 确实出现在响应中,但我还无法从返回的 JSON 中分离出 email。

我已经尝试浏览文档,但我还没有找到关于我可以添加到currentAuthenticatedUser()的属性选项之类的信息,或者是否有另一种更干净的方法(我假设有)。

编辑:看起来像以下作品:

Auth.currentAuthenticatedUser().then((user) => {
  console.log('user email = ' + user.attributes.email);
});

但我仍然希望能更好地理解文档。 我在一个随机的 github 问题中找到了这个解决方案,而不是官方文档。 我可以在 AWS Amplify / Cognito 文档中的何处找到此解决方案?

你可以从官方文档中查看这个

并启用读取访问常规设置-> 应用程序客户端-> 显示详细信息-> 设置属性读写权限链接

然后确保您正在获取更新的属性

Auth.currentAuthenticatedUser({ bypassCache: true })
Auth.currentSession()
    .then((data) => {
       // this data has user details in accessToken
    }).catch(err => console.log(err));
    import cognito from "../path/to/your/config/cognito.json";
    import Amplify, { Auth, Hub } from 'aws-amplify';
    ...
    ...


    useEffect(() => {
        Amplify.configure({ Auth: cognito });
        Hub.listen('auth', ({ payload: { event, data } }) => {
            switch (event) {
                case 'signIn':
                    console.log('Event name -> ', event, data)
                    // here is your name, email e.t.c.
                    console.log(data.signInUserSession.idToken.payload);
                    break
                case 'signOut':
                    console.log('sign out')
                    // this.setState({ user: null })
                    break
                default:
                    console.log('Unhandled use case - ' + event)
            }
        })
    }, [])
import { Auth } from 'aws-amplify';

Auth.currentAuthenticatedUser({
  bypassCache: false // Optional, By default is false. If set to true, this call will send a request to Cognito to get the latest user data
})
  .then((user) => console.log(user))
  .catch((err) => console.log(err));

这是我写的一个很好用的钩子:

import { useEffect, useState } from "react";
import { Auth } from "aws-amplify";


export interface UserDetailsT {
    username: string,
    email: string,
    emailVerified: boolean,
};


const useAuth = () => {
    const [userDetails, setUserDetails] = useState<UserDetailsT | null>(null);
    
    useEffect(() => {
        const getUserDetails = async () => {
            try {
                const { username, attributes } = await Auth.currentAuthenticatedUser() || null;
                setUserDetails({
                    username,
                    email: attributes?.email,
                    emailVerified: attributes?.email_verified
                });
            } catch {
                setUserDetails(null);
            }
        }
        getUserDetails();
    }, [Auth, setUserDetails]);

    return userDetails;
};


export default useAuth;

用户登录后,以下对我有用...

import { Auth, Amplify } from 'aws-amplify'

console.log(Auth.user.attributes.email)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM