public bool RefreshToken(IAuthorizationState authorization, TimeSpan?skipIfUsefulLifeExceeds,
                                 Func <IDirectedProtocolMessage, IProtocolMessage> requestProvider)
        {
            authorization.ThrowIfNull("authorization");
            Certificate.ThrowIfNull("certificate");
            bool result = false;

            // Check if the token is still valid.
            if (skipIfUsefulLifeExceeds.HasValue && authorization.AccessTokenExpirationUtc.HasValue)
            {
                TimeSpan timeSpan = authorization.AccessTokenExpirationUtc.Value - DateTime.UtcNow;
                if (timeSpan > skipIfUsefulLifeExceeds.Value)
                {
                    return(result);
                }
            }

            var requestMessage = GenerateMessage();
            var response       = requestProvider(requestMessage);

            // Response is not strongly-typed to an AccessTokenSuccessResponse because DotNetOpenAuth can't infer the
            // type from the request message type. The only way to get access to the result data is through the
            // resulting Dictionary.
            if (response.ExtraData.ContainsKey("access_token") && response.ExtraData.ContainsKey("expires_in"))
            {
                result = true;
                authorization.AccessToken = response.ExtraData["access_token"];
                long     expiresIn = long.Parse(response.ExtraData["expires_in"]);
                DateTime utcNow    = DateTime.UtcNow;
                authorization.AccessTokenExpirationUtc = new DateTime? (utcNow.AddSeconds(expiresIn));
                authorization.AccessTokenIssueDateUtc  = new DateTime? (utcNow);
                authorization.SaveChanges();
            }
            else
            {
                result = false;
            }
            return(result);
        }
Пример #2
0
        public bool RefreshToken(IAuthorizationState authorization, TimeSpan? skipIfUsefulLifeExceeds,
                                 Func<IDirectedProtocolMessage, IProtocolMessage> requestProvider) {
            authorization.ThrowIfNull("authorization");
            Certificate.ThrowIfNull("certificate");
            bool result = false;

            // Check if the token is still valid.
            if (skipIfUsefulLifeExceeds.HasValue && authorization.AccessTokenExpirationUtc.HasValue)
            {
                TimeSpan timeSpan = authorization.AccessTokenExpirationUtc.Value - DateTime.UtcNow;
                if (timeSpan > skipIfUsefulLifeExceeds.Value)
                {
                    return result;
                }
            }

            var requestMessage = GenerateMessage();
            var response = requestProvider(requestMessage);

            // Response is not strongly-typed to an AccessTokenSuccessResponse because DotNetOpenAuth can't infer the
            // type from the request message type. The only way to get access to the result data is through the
            // resulting Dictionary.
            if (response.ExtraData.ContainsKey("access_token") && response.ExtraData.ContainsKey("expires_in")) {
                result = true;
                authorization.AccessToken = response.ExtraData["access_token"];
                long expiresIn = long.Parse(response.ExtraData["expires_in"]);
                DateTime utcNow = DateTime.UtcNow;
                authorization.AccessTokenExpirationUtc = new DateTime? (utcNow.AddSeconds(expiresIn));
                authorization.AccessTokenIssueDateUtc = new DateTime? (utcNow);
                authorization.SaveChanges();
            } else {
                result = false;
            }
            return result;
        }