From e07fb2de7ae36d26871d7575c9c38f34d41a33d1 Mon Sep 17 00:00:00 2001 From: Mark van der Wal Date: Wed, 23 Feb 2022 10:33:59 +0100 Subject: [PATCH] AW-3569 Added posibility to login with username/password --- FarmmapsApi/Models/Configuration.cs | 3 +++ FarmmapsApi/Services/FarmmapsApiService.cs | 12 +++++++++--- FarmmapsApi/Services/OpenIdConnectService.cs | 14 ++++++++++++++ FarmmapsZonering/FarmmapsZonering.csproj | 3 --- Secrets/appsettings.json | 13 ++++++++----- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/FarmmapsApi/Models/Configuration.cs b/FarmmapsApi/Models/Configuration.cs index ee29b7e..5892c05 100644 --- a/FarmmapsApi/Models/Configuration.cs +++ b/FarmmapsApi/Models/Configuration.cs @@ -7,8 +7,11 @@ public string BasePath { get; set; } public string DiscoveryEndpointUrl { get; set; } public string RedirectUri { get; set; } + public string GrantClientId { get; set; } public string ClientId { get; set; } public string ClientSecret { get; set; } + public string Username { get; set; } + public string Password { get; set; } public string[] Scopes { get; set; } } } \ No newline at end of file diff --git a/FarmmapsApi/Services/FarmmapsApiService.cs b/FarmmapsApi/Services/FarmmapsApiService.cs index 6c18202..b828381 100644 --- a/FarmmapsApi/Services/FarmmapsApiService.cs +++ b/FarmmapsApi/Services/FarmmapsApiService.cs @@ -53,9 +53,16 @@ namespace FarmmapsApi.Services throw new AuthenticationException("Already seems to be authenticated"); var disco = await _openIdConnectService.GetDiscoveryDocumentAsync(); - var token = await _openIdConnectService.GetTokenClientCredentialsAsync(disco.TokenEndpoint, - _configuration.ClientId, _configuration.ClientSecret); + var usePasswordGrant = string.IsNullOrEmpty(_configuration.ClientId) || + string.IsNullOrEmpty(_configuration.ClientSecret); + + var token = usePasswordGrant ? + await _openIdConnectService.GetTokenUsernamePasswordAsync(disco.TokenEndpoint, + _configuration.GrantClientId, _configuration.Username, _configuration.Password) : + await _openIdConnectService.GetTokenClientCredentialsAsync(disco.TokenEndpoint, + _configuration.ClientId, _configuration.ClientSecret); + if (token.IsError) throw new AuthenticationException(token.Error); @@ -314,7 +321,6 @@ namespace FarmmapsApi.Services farmmapsUploader.UploadSessionData += data => location = data.UploadUri; var progress = await farmmapsUploader.UploadAsync(); - return new UploadResults(progress, location); } diff --git a/FarmmapsApi/Services/OpenIdConnectService.cs b/FarmmapsApi/Services/OpenIdConnectService.cs index d2a0788..e30ca2d 100644 --- a/FarmmapsApi/Services/OpenIdConnectService.cs +++ b/FarmmapsApi/Services/OpenIdConnectService.cs @@ -2,6 +2,7 @@ using System.Net.Http; using System.Threading.Tasks; using FarmmapsApi.Models; +using IdentityModel; using IdentityModel.Client; namespace FarmmapsApi.Services @@ -40,6 +41,19 @@ namespace FarmmapsApi.Services }); } + public async Task GetTokenUsernamePasswordAsync(string tokenEndpointUrl, string grantClientId, string username, string password) + { + return await _httpClient.RequestPasswordTokenAsync(new PasswordTokenRequest() + { + Address = tokenEndpointUrl, + UserName = username, + Password = password, + ClientId = grantClientId, + GrantType = OidcConstants.GrantTypes.Password, + Scope = string.Join(" ", _configuration.Scopes) + }); + } + public async Task RefreshTokensAsync(string tokenEndpointUrl, string refreshToken) { return await _httpClient.RequestRefreshTokenAsync(new RefreshTokenRequest() diff --git a/FarmmapsZonering/FarmmapsZonering.csproj b/FarmmapsZonering/FarmmapsZonering.csproj index beb87d4..7bc9ac4 100644 --- a/FarmmapsZonering/FarmmapsZonering.csproj +++ b/FarmmapsZonering/FarmmapsZonering.csproj @@ -17,8 +17,5 @@ - - - diff --git a/Secrets/appsettings.json b/Secrets/appsettings.json index 94c4c9a..46059a6 100644 --- a/Secrets/appsettings.json +++ b/Secrets/appsettings.json @@ -1,23 +1,26 @@ { //There are three farmmaps environments, uncomment the environemnt you want to use with this sample client - ////test environment - //"Authority": "https://accounts.test.farmmaps.eu/", - //"Endpoint": "https://test.farmmaps.eu/", - //"BasePath": "api/v1", - //"DiscoveryEndpointUrl": "https://accounts.test.farmmaps.eu/.well-known/openid-configuration", + //test environment +// "Authority": "https://accounts.test.farmmaps.eu/", +// "Endpoint": "https://test.farmmaps.eu/", +// "BasePath": "api/v1", +// "DiscoveryEndpointUrl": "https://accounts.test.farmmaps.eu/.well-known/openid-configuration", +// "GrantClientId": "farmmapstesteu", ////acceptance environment //"Authority": "https://accounts.acc.farmmaps.eu/", //"Endpoint": "https://acc.farmmaps.eu/", //"BasePath": "api/v1", //"DiscoveryEndpointUrl": "https://accounts.acc.farmmaps.eu/.well-known/openid-configuration", + //"GrantClientId": "farmmapsacceu", //production environment "authority": "https://accounts.farmmaps.eu/", "endpoint": "https://farmmaps.eu/", "basepath": "api/v1", "discoveryendpointurl": "https://accounts.farmmaps.eu/.well-known/openid-configuration", + "GrantClientId": "farmmaps", //overige info "RedirectUri": "http://example.nl/api",