0

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";

Ayeemba
  • 37
  • 4

2 Answers2

1

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;
  }
}
Peter Csala
  • 17,736
  • 16
  • 35
  • 75
0

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.

eli6
  • 964
  • 5
  • 15
  • The `sub` attribute is globally unique [afaik](https://forums.aws.amazon.com/message.jspa?messageID=766189). – jarmod Feb 27 '22 at 15:56
  • Yes so technically it would be enough to save the sub for uniqueness, but in the other question I link to they explain why it can be useful for backup reasons to save the username together with the sub – eli6 Feb 27 '22 at 15:59
  • Agree, actually both the username (email) and identity provider namespace. – jarmod Feb 27 '22 at 16:01