public async Task <UnsignedPayload> VerifyUnsign(string creyticket) { var(issuer, data) = SignatureHelper.Data(creyticket.Trim(), secret_); var values = data.ToDictionary(x => x.Type, x => x.Value); var result = new UnsignedPayload { version = byte.Parse(values[nameof(SignedPayload.version)]), issuer = issuer, timestamp = DateTimeOffset.Parse(values[nameof(SignedPayload.timestamp)]), callback = new Uri(values[nameof(UnsignedPayload.callback)]), }; // TODO: validate exception are mapped to proper HTTP codes if (result.timestamp >= DateTimeOffset.UtcNow.AddSeconds(30) || result.timestamp < new DateTimeOffset(new DateTime(2020, 01, 01))) { throw new ValidationException($"Invalid {nameof(result.timestamp)}"); } var user = await users_.Value.FindUserByAccountIdAsync(result.issuer) ?? throw new AccountNotFoundException(result.issuer.ToString()); return(result); }