public IActionResult VerifyPhoneNumber([Required] string id, [FromBody] VerifyPhoneNumberRequest request)
        {
            Authorize.TokenAgainstResource(HttpContext.User, id);

            _customerService.VerifyPhoneNumber(id, request.VerificationCode);

            return(Ok());
        }
Example #2
0
 public Task <VerifyPhoneNumberResponse> VerifyPhoneNumberAsync(
     VerifyPhoneNumberRequest request,
     CancellationToken cancellationToken)
 {
     return(SendPostRequestAsync <VerifyPhoneNumberResponse>(
                "/verify-phone-number",
                request,
                cancellationToken));
 }
Example #3
0
        /**
         * Set user address.
         */
        private async Task <APIGatewayProxyResponse> VerifyPhoneNumber(IDataStores dataStores,
                                                                       IDictionary <string, string> requestHeaders,
                                                                       JObject requestBody)
        {
            Debug.Untested();
            Debug.AssertValid(dataStores);
            Debug.AssertValid(requestHeaders);
            Debug.AssertValidOrNull(requestBody);

            try {
                // Log call
                LoggingHelper.LogMessage($"UserIdentityService::VerifyPhoneNumber()");

                // Get the NoSQL DB client
                AmazonDynamoDBClient dbClient = (AmazonDynamoDBClient)dataStores.GetNoSQLDataStore().GetDBClient();
                Debug.AssertValid(dbClient);

                // Check inputs
                VerifyPhoneNumberRequest verifyPhoneNumberRequest = UserIdentityService_VerifyPhoneNumber_LogicLayer.CheckValidVerifyPhoneNumberRequest(requestBody);
                Debug.AssertValid(verifyPhoneNumberRequest);

                // Check authenticated endpoint security
                string loggedInUserId = await APIHelper.CheckLoggedIn(dbClient, requestHeaders);

                Debug.AssertID(loggedInUserId);

                // Perform logic
                await UserIdentityService_VerifyPhoneNumber_LogicLayer.VerifyPhoneNumber(dbClient, loggedInUserId, verifyPhoneNumberRequest);

                // Respond
                return(new APIGatewayProxyResponse {
                    StatusCode = APIHelper.STATUS_CODE_NO_CONTENT
                });
            } catch (Exception exception) {
                Debug.Tested();
                if (exception.Message == IdentityServiceLogicLayer.ERROR_INCORRECT_PASSWORD)
                {
                    Debug.Untested();
                    //??-- ObjectResult result = new ObjectResult(new GeneralErrorResponse { error = IdentityServiceLogicLayer.INCORRECT_PASSWORD });
                    // result.StatusCode = APIHelper.STATUS_CODE_UNAUTHORIZED;
                    // return result;
                    return(new APIGatewayProxyResponse {
                        StatusCode = APIHelper.STATUS_CODE_UNAUTHORIZED,
                        Body = $"{{ error = \"{IdentityServiceLogicLayer.INCORRECT_PASSWORD}\" }}"
                    });
                }
                else
                {
                    Debug.Tested();
                    return(APIHelper.ResponseFromException(exception));
                }
            }
        }
        public async Task <BaseResponse> ResendVerificationCode(VerifyPhoneNumberRequest request)
        {
            // Get the user
            var user = await userManager.FindByIdAsync(hasher.Decrypt(request.UserId));

            // Generate verification code
            var verificationCode = await userManager.GenerateChangePhoneNumberTokenAsync(user, hasher.Decrypt(request.PhoneNumber));

            // Send the verification code email
            var result = await messager.SendAccountVerificationEmail(user.Email, verificationCode, user.DefaultLang);

            if (!result.Success)
            {
                return(new BaseResponse(true, 700, result.Message));
            }

            return(new BaseResponse(true, (int)HttpStatusCode.OK, localizer["VerificationCodeSuccessfully"]));
        }
        public async Task <TokenResponse> VerifyPhoneNumberAsync(VerifyPhoneNumberRequest verifyRequest)
        {
            var user = await userManager.FindByIdAsync(hasher.Decrypt(verifyRequest.UserId));

            var roles = await userManager.GetRolesAsync(user);

            var result = await userManager.ChangePhoneNumberAsync(user, hasher.Decrypt(verifyRequest.PhoneNumber), verifyRequest.Code);

            if (!result.Succeeded)
            {
                return(new TokenResponse(null, hasher.Encrypt(user.Id), hasher.Encrypt(user.PhoneNumber), false, 400, localizer["RegisterAccountVerifyTokenErrMsg"], result.Errors.Select(p => new ValidationError {
                    Name = p.Description, Description = p.Description
                }).ToList()));
            }
            // phone activate successfully.
            // generate token
            var token = tokenHandler.CreateAccessToken(user, null);

            return(new TokenResponse(token, hasher.Encrypt(user.Id), hasher.Encrypt(user.PhoneNumber), true, 200, localizer["LoginResponseSuccessMsg"]));
        }
        /**
         * Verify phone number.
         */
        public static async Task VerifyPhoneNumber(AmazonDynamoDBClient dbClient, string loggedInUserId, VerifyPhoneNumberRequest verifyPhoneNumberRequest)
        {
            Debug.Tested();
            Debug.AssertValid(dbClient);
            Debug.AssertID(loggedInUserId);
            Debug.AssertValid(verifyPhoneNumberRequest);
            Debug.AssertString(verifyPhoneNumberRequest.oneTimePassword);

            // Find valid link
            Link link = await FindValidLinkByUserID(dbClient, loggedInUserId, IdentityServiceLogicLayer.LINK_TYPE_VERIFY_PHONE_NUMBER);

            Debug.AssertValidOrNull(link);
            if (link != null)
            {
                // Valid link exists
                Debug.Tested();
                Debug.AssertString(link.OneTimePassword);
                if (link.OneTimePassword == verifyPhoneNumberRequest.oneTimePassword)
                {
                    // One-time password matches
                    Debug.Tested();

                    // Load the user
                    User user = await IdentityServiceLogicLayer.FindUserByID(dbClient, loggedInUserId);

                    Debug.AssertValid(user);
                    Debug.AssertValidOrNull(user.PhoneNumberVerified);
                    if (user.PhoneNumberVerified == null)
                    {
                        // User's phone number not verified
                        Debug.Untested();

                        // Change the user and revoke the link
                        await DoVerifyPhoneNumber(dbClient, user, link);
                    }
                    else
                    {
                        Debug.Untested();
                        throw new Exception(IdentityServiceLogicLayer.ERROR_PHONE_NUMBER_VERIFIED, new Exception(IdentityServiceLogicLayer.PHONE_NUMBER_VERIFIED));
                    }
                }
                else
                {
                    Debug.Tested();
                    throw new Exception(IdentityServiceLogicLayer.ERROR_INCORRECT_PASSWORD, new Exception(IdentityServiceLogicLayer.INCORRECT_PASSWORD));
                }
            }
            else
            {
                Debug.Tested();
                throw new Exception(SharedLogicLayer.ERROR_INVALID_LINK, new Exception(SharedLogicLayer.ERROR_INVALID_LINK));
            }
        }