private async Task <VerifyPinResponse> CheckOtpCommon(Action <VerifyPinInput> transformAction)
        {
            // todo: implement settings and register using normal way
            var settings = new Mock <IOtpSettings>();

            settings.SetupGet(s => s.PasswordLength).Returns(6);
            settings.SetupGet(s => s.Alphabet).Returns("0123456789");

            var currentPin = string.Empty;
            var storage    = new Dictionary <Guid, string>();

            var otpStorage = new Mock <IOtpStorage>();

            otpStorage.Setup(s => s.SaveAsync(It.IsAny <OtpDto>())).Returns <OtpDto>(dto =>
            {
                currentPin = dto.Pin;
                storage.Add(dto.OperationId, dto.Pin);
                return(Task.CompletedTask);
            });
            otpStorage.Setup(s => s.GetAsync(It.IsAny <Guid>())).Returns <Guid>(id => Task.FromResult(new OtpDto
            {
                Pin         = storage[id],
                OperationId = id,
                ExpiresOn   = DateTime.MaxValue
            }));

            var otp = new OtpAppService(
                new NullSmsGateway(),
                LocalIocManager.Resolve <IEmailSender>(),
                otpStorage.Object,
                new OtpGenerator(settings.Object),
                LocalIocManager.Resolve <ISettingManager>(),
                settings.Object
                );

            var sendResponse = await otp.SendPinAsync(new SendPinInput()
            {
                Lifetime = 60,
                SendTo   = "1234567890",
                SendType = OtpSendType.Sms
            });

            var verificationInput = new VerifyPinInput()
            {
                OperationId = sendResponse.OperationId,
                Pin         = currentPin
            };

            transformAction?.Invoke(verificationInput);

            return(await otp.VerifyPinAsync(verificationInput));
        }
示例#2
0
        /// <summary>
        /// Verify one-time-pin
        /// </summary>
        public async Task <VerifyPinResponse> VerifyPinAsync(VerifyPinInput input)
        {
            if (!_otpSettings.IgnoreOtpValidation)
            {
                var pinDto = await _otpStorage.GetAsync(input.OperationId);

                if (pinDto == null || pinDto.Pin != input.Pin)
                {
                    return(VerifyPinResponse.Failed("Wrong one time pin"));
                }

                if (pinDto.ExpiresOn < DateTime.Now)
                {
                    return(VerifyPinResponse.Failed("One-time pin has expired, try to send a new one"));
                }
            }

            return(VerifyPinResponse.Success());
        }