AWS Cognito: Parse Google Sign Mapped Attribute - Gender


Recently I had integrated Google sign using AWS Cognito in my Next.js application. I had mapped the Google attributes with some custom attributes in my user pool.

So custom field custom:social_gender was mapped to Google attribute genders. I had received the value in the custom gender field as encoded string. Here is a sample,

'%7B%22resourceName%22%3A%22people%2FXXXXXXXXXXXXXXXXXXXX%22%2C%22etag%22%3A%22XXXXXXXXXXXXXXXXXXXXX%22%2C%22genders%22%3A%5B%7B%22metadata%22%3A%7B%22primary%22%3Atrue%2C%22source%22%3A%7B%22type%22%3A%22PROFILE%22%2C%22id%22%3A%22XXXXXXXXXXXXXXXXXXXX%22%7D%7D%2C%22value%22%3A%22male%22%2C%22formattedValue%22%3A%22Male%22%7D%5D%2C%22birthdays%22%3A%5B%7B%22metadata%22%3A%7B%22primary%22%3Atrue%2C%22source%22%3A%7B%22type%22%3A%22ACCOUNT%22%2C%22id%22%3A%22XXXXXXXXXXXXXXXXXXXX%22%7D%7D%2C%22date%22%3A%7B%22year%22%3A1901%2C%22month%22%3A1%2C%22day%22%3A1%7D%7D%5D%7D'

Here is how I parsed the data,

let encoded_data = '%7B%22resourceName%22%3A%22people%2FXXXXXXXXXXXXXXXXXXXX%22%2C%22etag%22%3A%22XXXXXXXXXXXXXXXXXXXXX%22%2C%22genders%22%3A%5B%7B%22metadata%22%3A%7B%22primary%22%3Atrue%2C%22source%22%3A%7B%22type%22%3A%22PROFILE%22%2C%22id%22%3A%22XXXXXXXXXXXXXXXXXXXX%22%7D%7D%2C%22value%22%3A%22male%22%2C%22formattedValue%22%3A%22Male%22%7D%5D%2C%22birthdays%22%3A%5B%7B%22metadata%22%3A%7B%22primary%22%3Atrue%2C%22source%22%3A%7B%22type%22%3A%22ACCOUNT%22%2C%22id%22%3A%22XXXXXXXXXXXXXXXXXXXX%22%7D%7D%2C%22date%22%3A%7B%22year%22%3A1901%2C%22month%22%3A1%2C%22day%22%3A1%7D%7D%5D%7D';
let parsed_data = JSON.parse(decodeURIComponent(encoded_data));
console.log(parsed_data);
/* 
// ## the encoded data was parsed into a JSON object
{
    "resourceName": "people/XXXXXXXXXXXXXXXXXXXX",
    "etag": "XXXXXXXXXXXXXXXXXXXXX",
    "genders": [
        {
            "metadata": {
                "primary": true,
                "source": {
                    "type": "PROFILE",
                    "id": "XXXXXXXXXXXXXXXXXXXX"
                }
            },
            "value": "male",
            "formattedValue": "Male"
        }
    ],
    "birthdays": [
        {
            "metadata": {
                "primary": true,
                "source": {
                    "type": "ACCOUNT",
                    "id": "XXXXXXXXXXXXXXXXXXXX"
                }
            },
            "date": {
                "year": 1901,
                "month": 1,
                "day": 1
            }
        }
    ]
}
*/