/// <summary>
        /// Validates the input token
        /// </summary>
        /// <param name="token"></param>
        /// <param name="requestUrl"></param>
        /// <param name="apiKey"></param>
        /// <param name="timestamp"></param>
        public static bool ValidateToken(string token, string requestUrl, ProjectAuthKey apiKey, out DateTime timestamp)
        {
            if (apiKey is null)
            {
                throw new ArgumentNullException(nameof(apiKey));
            }

            //assign MinValue to expire immediately if the TryParse were to fail
            timestamp = DateTime.MinValue;

            var decodedToken = GetDecodedToken(token, requestUrl);

            double timeStampDouble;

            if (double.TryParse(decodedToken.Timestamp, NumberStyles.Any, CultureInfo.InvariantCulture, out timeStampDouble))
            {
                timestamp = timeStampDouble.FromUnixTime();
            }

            //generate a signature and verify it matches the token signature
            var validationSignature = GetSignature(requestUrl, decodedToken.Timestamp, decodedToken.Nonce, apiKey.AuthKey);

            if (validationSignature != decodedToken.RequestSignature)
            {
                return(false);
            }

            return(true);
        }
        /// <summary>
        /// Create a new auth key for the member/project which will generate a 256 bit random key
        /// </summary>
        /// <param name="memberId"></param>
        /// <param name="projectId"></param>
        /// <returns></returns>
        public ProjectAuthKey CreateAuthKey(int memberId, int projectId, string description = "")
        {
            var key = new ProjectAuthKey
            {
                DateCreated = DateTime.UtcNow,
                AuthKey     = GenerateKey(32),// generate a 256 bit random key
                MemberId    = memberId,
                ProjectId   = projectId,
                Description = description
            };

            _dbContext.Database.Save(key);

            return(key);
        }