---
# System prepended metadata

title: User Management System of abc123 using Unity-Lambda-Cognito
tags: [Dragon Cloud AI]

---

User Management System of abc123 using Unity-Lambda-Cognito
===
#### Author: Po-Wen (Steven) Fang

###### tags: `Dragon Cloud AI`

[TOC]

## Work Flow

Lambda function: abc123_Unity_Cognito

At the Unity frontend, we invoke Lambda function to access to Cognito.
![](https://i.imgur.com/U9RmkUP.jpg)



input and output are all JSON format.

Please note that signing up new user requires attributes that are different from previous React/Native UI. 

User's information that should be entered includes:
1. username
2. password
3. name
4. gender
5. birthdate
6. address
7. email
8. locale
9. Institute





## Implemented Functions 
### Sign up new user
Allows user to create a new account in our system. After signing up, user will receive an email contains the confirmation code.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "SignUp",
  "username": "someone@email.com",
  "password": "123MyPasswordIsPassword",
  "name": "haventfigureoutname",
  "gender": "female",
  "birthdate": "2020-02-02",
  "address": "7F No.270 ZhongXiao east road",
  "email": "someone@email.com",
  "locale": "Taipei",
  "Institute": "NTU"
}
```

* #### intent -- (string)
Should be "SignUp"
* #### username -- (string)
Username is always an email address.
* #### password -- (string)
Length fall between 8 and 256. Should contain at least one upper letter, one lower letter, one number. Special character is not allowed.
* #### name -- (string)
Alternative name
* #### gender -- (string)
"male" or "female"
* #### birthdate -- (string)
Format: "year-mm-dd"
* #### address -- (string)
* #### email -- (string)
Should be the same with username
* #### locale -- (string)
(a list allow user to select?)

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "successfully sign up!"
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 


---

### Confirmation of sign up new user
Users are required to enter the confirmation code sent to their email.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "confirmSignUp",
  "username": "someone@email.com",
  "ConfirmationCode": "123456"
}
```

* #### intent -- (string)
Should be "confirmSignUp"
* #### username -- (string)
Username is always an email address
* #### ConfirmationCode -- (string)
Confirmation code entered by user, length should always be 6

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "confirmed sign up."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 

---

### Resend the confirmation code
Users can request to send another confirmation code again.
#### Parameters:
>example input from Unity:
```json=
{
  "intent": "resendConfirmationCode",
  "username": "someone@email.com"
}
```

* #### intent -- (string)
Should be "login"
* #### username -- (string)
Username is always an email address

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "Confirmation code has been sent again."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 

---


### User login
User login with a account that already existed in our user pool.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "login",
  "username": "someone@email.com",
  "password": "123MyPasswordIsPassword"
}
```

* #### intent -- (string)
Should be "login"
* #### username -- (string)
Username is always an email address
* #### password -- (string)
Length fall between 8 and 256. Should contain at least one upper letter, one lower letter, one number. Special character is not allowed.

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": {
    "AccessToken": "eyJraWQiOiJrckRcL2l2N2VBeVp",
    "ExpiresIn": 3600,
    "TokenType": "Bearer",
    "RefreshToken": "eyJra324fiOiJrckRcL2l2N2dwaeVp",
    "IdToken": "eyJraWQiOiJrawef22l2N2VBeVp"
  }
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### AccessToken -- (string)
The access token that allows this specific user to access other function
* #### ExpiresIn -- (int)
The expiration period of the authentication result in seconds
* #### TokenType -- (string)
The token type (does not necessary for our application now)
* #### RefreshToken -- (string)
The refresh token (does not necessary for our application now)
* #### IdToken -- (string)
The ID token (does not necessary for our application now)


---

### Forgot password
A confirmation code will be sent to user's email that is required to change user's password.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "forgotPassword",
  "username": "someone@email.com"
}
```
* #### intent -- (string)
Should be "forgotPassword"
* #### username -- (string)
Username is always an email address

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "Confirmation code has been sent."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 


---
### Confirm forgot password
Confirms the new password set by user.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "confirmForgotPassword",
  "ConfirmationCode": "123456",
  "password": "NewPassword123",
  "username": "someone@email.com"
}
```
* #### intent -- (string)
Should be "confirmForgotPassword"
* #### ConfirmationCode -- (string)
Confirmation code entered by user, length should always be 6
* #### password -- (string)
New password set by user. Length fall between 8 and 256. Should contain at least one upper letter, one lower letter, one number. Special character is not allowed.
* #### username -- (string)
Username is always an email address

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "password has been changed."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 

---


### Change password
Change a new password, requires previous password.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "changePassword",
  "AccessToken": "eyJraWQiOiJrckRcL2l2N2VBeVp",
  "PreviousPassword": "123MyPasswordIsPassword",
  "ProposedPassword": "NewPassword123"
}
```
* #### intent -- (string)
Should be "changePassword"
* #### AccessToken -- (string)
The access token that received at user login
* #### PreviousPassword -- (string)
Previous password
* #### ProposedPassword -- (string)
New password proposed by user. Length fall between 8 and 256. Should contain at least one upper letter, one lower letter, one number. Special character is not allowed.

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "password has been changed."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 


---


### Delete user account
Delete this user account in our system.
#### Parameters:
>example input from Unity:

```json=
{
  "intent": "deleteUser",
  "AccessToken": "eyJraWQiOiJrckRcL2l2N2VBeVp"
}
```
* #### intent -- (string)
Should be "deleteUser"
* #### AccessToken -- (string)
The access token that received at user login

#### Returns:
>example return JSON object:
```json=
{
  "statusCode": 200,
  "body": "user deleted."
}
```
* #### statusCode -- (int)
200 indicates success, 400 indicates error
* #### body -- (string)
Contains the message indicating action status 



---


## User Table in DynamoDB (WIP)
trigger in Cognito


login via dynamoDB?


## References

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CognitoIdentityServiceProvider.html

https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_Operations.html