Home > Blockchain >  Best attribute to use from AWS CognitoUser class for primary key in DynamoDB
Best attribute to use from AWS CognitoUser class for primary key in DynamoDB

Time:03-01

I am trying to make the primary key of my dynamodb table something like user_uuid. The user is being created in AWS Cognito and I can't seem to find a uuid like field as part of the CognitoUser class. I am trying to avoid using the username as the pk.

Can someone guide me to the right solution? I can't seem to find anything on the internet regarding a user_uuid field and for some reason I can't even find the documentation of CognitoUser class that is imported from "amazon-cognito-identity-js";

CodePudding user response:

Cognito user unique identifiers can be saved to a database using a combination of the "sub" value and the username, please refer to this question for a more lengthy discussion.

In the description of amazon-cognito-identity-js (found here, use case 5), they show how to get the userAttributes of a CognitoUser. One of the attributes is the sub value, which you can get at for example like this:

  user.getUserAttributes(function(err, attributes) {
    if (err) {
      // Handle error
    } else {
      // Do something with attributes
      const sub = attributes.find(obj => obj.Name === 'sub').Value;
    }
  });

I couldn't find any documentation on the available user attributes either, I recommend using the debugger to look at the user attributes returned from the function.

CodePudding user response:

Depends if you plan to use email or phone as a 'username'. In that case, I would use the sub because it never changes. But, the sub is not k-sortable so that requires the use of an extra DB item and index/join to make users sortable by date added. If you plan to generate your GUID/KSUID, and only use email/phone as an alias, then I would use the 'username' as a common id between your DB and userpool.

Good luck with your project!

FWIW - the KSUID generators found in wild are massively overbuilt. 3000 lines of code and 80 dependencies. I made my own k-sortable and prefixed pseudo-random ID gen for Cognito users. Here's the code.

export function idGen(prefix: any) {
  const validPrefix = [
    'prefix1',
    'prefix2'
  ];

  //check if prefix argument is supplied
  if (!prefix) {
    return 'error! must supply prefix';
  }

  //check if value is a valid type
  else if (validPrefix.indexOf(prefix) == -1) {
    return 'error! prefix value supplied must be: '   validPrefix;
  } else {
    // generate epoch time in seconds
    const epoch = Math.round(Date.now() / 1000);

    // convert epoch time to 6 character base36 string
    const time = epoch.toString(36);

    // generate 20 character base36 pseudo random string
    const random =
      Math.random().toString(36).substring(2, 12)  
      Math.random().toString(36).substring(2, 12);

    // combine prefix, strings, insert : divider and return id
    return prefix   ':'   time   random;
  }
}
  • Related