如何访问Cognito用户帐户的组?

时间:2017-01-24 12:34:13

标签: aws-sdk amazon-cognito aws-cognito

在AWS Cognito中,您可以将用户添加到组中(首次创建组后)。用户可以属于一个或多个组。

使用JavaScipt SDK(https://github.com/aws/amazon-cognito-identity-js),有没有办法读取指定的组? aws-sdk会通过amazon-cognito-identity-js提供访问权限吗?

6 个答案:

答案 0 :(得分:22)

如果您只需要Cognito UserPools组,则Authenticated User是其成员,而不是进行单独的API调用,该数据将在您进行身份验证时收到的idToken.jwtToken中进行编码。

这对于angular / react / etc中的客户端呈现/访问决策非常有用。应用

请参阅此示例中的“cognito:groups”数组声明解码后的idToken.jwtToken:

{
  "sub": "a18626f5-a011-454a-b4c2-6969b3155c24",
  "cognito:groups": [
    "uw-app-administrator",
    "uw-app-user"
  ],
  "email_verified": true,
  "iss": "https://cognito-idp.<region>.amazonaws.com/<user-pool-id>",
  "cognito:username": "<my-user-name>",
  "given_name": "<my-first-name>",
  "aud": "<audience-code>",
  "token_use": "id",
  "auth_time": 1493918449,
  "nickname": "Bubbles",
  "exp": 1493922049,
  "iat": 1493918449,
  "email": "<my-email>"
}

希望这有帮助。

答案 1 :(得分:9)

我最初期望Cognito JavaScript API提供一个简单的属性或方法来返回组列表,但我得出的结论是它被隐藏在一个令牌中,因此必须了解jwt。一旦建立了Cognito用户并检索了会话,就可以在IdToken中使用组数组。

var jwtDecode = require('jwt-decode');
var AmazonCognitoIdentity = require('amazon-cognito-identity-js');
var CognitoUserPool = AmazonCognitoIdentity.CognitoUserPool;
var CognitoUser = AmazonCognitoIdentity.CognitoUser;

var userPool = new CognitoUserPool({UserPoolId:'', ClientId:''");
...
app.get('/app', function(req, res){
    var cognitoUser = userPool.getCurrentUser();
    if(cognitoUser != null){
        cognitoUser.getSession(function(err, session) {
            if (err) {
                console.error(err);
                return;
            }
            console.log('session validity: ' + session.isValid());

            var sessionIdInfo = jwtDecode(session.getIdToken().jwtToken);
            console.log(sessionIdInfo['cognito:groups']);
        });
    }
});

答案 2 :(得分:6)

此API确实存在 - AdminListGroupsForUser。顾名思义,您没有看到它的原因是API目前仅在管理员基础上可用。 Cognito在移动SDK中不包含管理API。它将包含在AWS SDK /服务器端SDK中,但值得注意的是,此API确实需要开发人员凭据,所有管理API也是如此。

答案 3 :(得分:1)

如果使用的是Amplify,则使用 currentAuthenticatedUser 方法,则可以使用以下方法从响应中获取组:

response.signInUserSession.idToken.payload['cognito:groups']

或使用 currentSession 方法,您可以使用以下任一方法:

response.accessToken.payload['cognito:groups']

response.idToken.payload['cognito:groups']

答案 4 :(得分:0)

您无需解码任何内容,数据已从session.getIdToken().payload['cognito:groups']

中获取

答案 5 :(得分:0)

如果您打算在后端列出特定用户的组并以API的形式返回它们,那么以下是使用golang的aws sdk的完整示例:

func sessionWithRegion(region *string) *session.Session {
    sess := Session.Copy()
    if v := aws.StringValue(sess.Config.Region); len(v) == 0 {
        sess.Config.Region = region
    }

    return sess
}

func getGroupsForUser(region, userPoolId, userName *string, limit int64, nextToken ...*string) (*cognitoidentityprovider.AdminListGroupsForUserOutput, error) {
    sess := sessionWithRegion(region)
    svc := cognitoidentityprovider.New(sess)

    input := &cognitoidentityprovider.AdminListGroupsForUserInput{
        UserPoolId: userPoolId,
        Username:   userName,
        Limit:      &limit,
    }

    if nextToken != nil && len(nextToken) > 0 {
        input.NextToken = nextToken[0]
    }

    return svc.AdminListGroupsForUser(input)

}

nextToken用于支持分页以加载更多的组,以防万一我们仍然有用户从cognito返回到return / fetch,换句话说就是要获取下一页。这是一个简单的示例,显示您的通话外观

func listGroups(pageNo *string) ([]*cognitoidentityprovider.GroupType, *string, error) {

    page, err := getGroupsForUser(aws.String("us-east-1"), aws.String("xxx"), aws.String("myuserName"), 60, map[bool]*string{true: pageNo, false: nil}[pageNo != nil])
    if err != nil {
        return nil, nil, err
    }
    return page.Groups, page.NextToken, nil
}

上面的代码段只是为了使您和社区中的其他同事更容易理解该想法及其实现方法,但是可能需要进行一些调整。如果您需要更多帮助,请随时发表评论。