From 1bfb3dbab8d58922a9521ea2423c8f14f2077b60 Mon Sep 17 00:00:00 2001 From: Klaus Fischer <klaus.fischer@eloware.com> Date: Tue, 7 Jun 2022 08:16:43 +0200 Subject: [PATCH] feat: Get OAuth token working from code --- E2ETests/E2ETests.csproj | 4 ++++ E2ETests/SenderTest.cs | 11 +++++++++++ FitConnect/FunctionalBaseClass.cs | 22 ++++++++++++++++++++++ FitConnect/Models/OAuthAccessToken.cs | 17 +++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 FitConnect/Models/OAuthAccessToken.cs diff --git a/E2ETests/E2ETests.csproj b/E2ETests/E2ETests.csproj index f6f674dd..5c22f888 100644 --- a/E2ETests/E2ETests.csproj +++ b/E2ETests/E2ETests.csproj @@ -15,4 +15,8 @@ <PackageReference Include="coverlet.collector" Version="3.1.0" /> </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\FitConnect\FitConnect.csproj" /> + </ItemGroup> + </Project> diff --git a/E2ETests/SenderTest.cs b/E2ETests/SenderTest.cs index fc1e9c85..4482f720 100644 --- a/E2ETests/SenderTest.cs +++ b/E2ETests/SenderTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using FitConnect; using FluentAssertions; using Newtonsoft.Json; using NUnit.Framework; @@ -9,6 +10,7 @@ namespace E2ETests; public class SenderTest { private string _clientId = ""; private string _clientSecret = ""; + private Sender _sender; [OneTimeSetUp] public void OneTimeSetup() { @@ -37,6 +39,8 @@ public class SenderTest { [SetUp] public void Setup() { + _sender = new Sender(null, + FitConnectEndpoints.Create(FitConnectEndpoints.EndpointType.Development)); } [Test] @@ -44,4 +48,11 @@ public class SenderTest { _clientId.Should().NotBe("00000000-0000-0000-0000-000000000000"); _clientSecret.Should().NotBe("0000000000000000000000000000000000000000000"); } + + [Test] + public void GetAccessToken() { + var token = _sender.GetTokenAsync(_clientId, _clientSecret).Result; + token.Should().NotBeNull(); + token.ExpiresIn.Should().Be(1800); + } } diff --git a/FitConnect/FunctionalBaseClass.cs b/FitConnect/FunctionalBaseClass.cs index 13ecf7df..9b7ba4c6 100644 --- a/FitConnect/FunctionalBaseClass.cs +++ b/FitConnect/FunctionalBaseClass.cs @@ -1,5 +1,7 @@ +using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text; +using FitConnect.Models; using Microsoft.Extensions.Logging; namespace FitConnect; @@ -85,6 +87,26 @@ public class FunctionalBaseClass { } + public async Task<OAuthAccessToken?> GetTokenAsync(string clientId, string clientSecret) { + var client = new HttpClient(); + client.DefaultRequestHeaders.Accept.Add( + MediaTypeWithQualityHeaderValue.Parse("application/json")); + var content = new FormUrlEncodedContent(new[] { + new KeyValuePair<string, string>("grant_type", "client_credentials"), + new KeyValuePair<string, string>("client_id", clientId), + new KeyValuePair<string, string>("client_secret", clientSecret) + }); + + var request = new HttpRequestMessage(HttpMethod.Post, Endpoints.TokenUrl) { + Content = content, + Method = HttpMethod.Post + }; + + var response = await client.SendAsync(request); + + return await response.Content.ReadFromJsonAsync<OAuthAccessToken>(); + } + private async Task<T?> RestCall<T>(Uri uri, HttpMethod method, string body) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Accept", "application/json"); diff --git a/FitConnect/Models/OAuthAccessToken.cs b/FitConnect/Models/OAuthAccessToken.cs new file mode 100644 index 00000000..87ac3872 --- /dev/null +++ b/FitConnect/Models/OAuthAccessToken.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; + +namespace FitConnect.Models; + +public class OAuthAccessToken { + [JsonPropertyName("access_token")] + public string AccessToken { get; set; } + + [JsonPropertyName("scope")] + public string Scope { get; set; } + + [JsonPropertyName("token_type")] + public string TokenType { get; set; } + + [JsonPropertyName("expires_in")] + public int ExpiresIn { get; set; } +} -- GitLab