public static async Task <IGenesysAccessToken> GetAuthTokenAsync(this CloudTable cloudTable, HttpClient apiClient
                                                                         , DateTime date
                                                                         , IGenesysClientCredentials clientCredentials
                                                                         , bool reload = false)
        {
            if (!reload)
            {
                try
                {
                    var existedToken = await cloudTable.GetAuthTokenAsync(clientCredentials);

                    if (existedToken?.ExpiresIn > date)
                    {
                        existedToken.Environment = clientCredentials.Environment;
                        return(existedToken);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception($"Cant load AccessToken from the Azure CloudTable '{cloudTable.Name}'.", ex);
                }
            }
            GenesysAuthTokenInfo authTokenInfo = null;

            authTokenInfo = await apiClient.GetTokenAsync(clientCredentials);

            if (authTokenInfo == null)
            {
                throw new Exception($"Genesys API Token is null. ClientId '{clientCredentials.ClientId}'.");
            }
            else if (!string.IsNullOrEmpty(authTokenInfo.Error))
            {
                throw new Exception($"Genesys API Token error. ClientId '{clientCredentials.ClientId}'. {authTokenInfo.Error}.");
            }

            var newToken = new GenesysAccessToken(clientCredentials)
            {
                Value     = authTokenInfo.AccessToken,
                ExpiresIn = date.AddSeconds(authTokenInfo.ExpiresIn ?? 1000),
                ETag      = "*"
            };

            await cloudTable.SetAuthTokenAsync(newToken);

            newToken.Environment = clientCredentials.Environment;
            return(newToken);
        }
예제 #2
0
        public static async Task <GenesysAuthTokenInfo> GetTokenAsync(this HttpClient httpClient, IGenesysClientCredentials clientCredentials)
        {
            var path = "/oauth/token";

            var basicAuth = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1")
                                                   .GetBytes($"{clientCredentials.ClientId}:{clientCredentials.ClientSecret}"));
            var request = new HttpRequestMessage(HttpMethod.Post, $"https://login.{clientCredentials.Environment}" + path);

            request.Headers.Authorization = new AuthenticationHeaderValue("Basic", basicAuth);
            var content = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair <string, string>("grant_type", "client_credentials"),
            });

            request.Content = content;
            var response = await httpClient.SendAsync(request);

            try
            {
                response.EnsureSuccessStatusCode();
                var responseContent = await response.Content.ReadAsStringAsync();

                var authTokenInfo = JsonConvert.DeserializeObject <GenesysAuthTokenInfo>(responseContent);
                return(authTokenInfo);
            }
            catch (HttpRequestException ex)
            {
                int statusCode = (int)response.StatusCode;
                throw new Exception($"Error calling Genesys API PostToken. Status Code {statusCode}.", ex);
            }
            catch (Exception ex)
            {
                throw new Exception($"Get Genesys token error.", ex);
            }
        }
 internal static string GetOrgId(this IGenesysClientCredentials credentials) => credentials.OrgId ?? "";
예제 #4
0
        public static async Task <GenesysAccessToken> GetAuthTokenAsync(this CloudTable cloudTable, IGenesysClientCredentials settings)
        {
            var q = new TableQuery <GenesysAccessToken>()
                    .Where(TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, settings.GetOrgId()),
                                                     TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, settings.ClientId)))
                    .Take(1);

            var res = await cloudTable.ExecuteQuerySegmentedAsync(q, null);

            return(res.FirstOrDefault());
        }
예제 #5
0
 public GenesysAccessToken(IGenesysClientCredentials settings)
 {
     PartitionKey = settings.GetOrgId();
     RowKey       = settings.ClientId;
 }