csharp-netcore.auth.OAuthAuthenticator.mustache Maven / Gradle / Ivy
{{>partial_header}}
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestSharp;
using RestSharp.Authenticators;
namespace {{packageName}}.Client.Auth
{
///
/// An authenticator for OAuth2 authentication flows
///
public class OAuthAuthenticator : AuthenticatorBase
{
readonly string _tokenUrl;
readonly string _clientId;
readonly string _clientSecret;
readonly string _grantType;
readonly JsonSerializerSettings _serializerSettings;
readonly IReadableConfiguration _configuration;
///
/// Initialize the OAuth2 Authenticator
///
public OAuthAuthenticator(
string tokenUrl,
string clientId,
string clientSecret,
OAuthFlow? flow,
JsonSerializerSettings serializerSettings,
IReadableConfiguration configuration) : base("")
{
_tokenUrl = tokenUrl;
_clientId = clientId;
_clientSecret = clientSecret;
_serializerSettings = serializerSettings;
_configuration = configuration;
switch (flow)
{
/*case OAuthFlow.ACCESS_CODE:
_grantType = "authorization_code";
break;
case OAuthFlow.IMPLICIT:
_grantType = "implicit";
break;
case OAuthFlow.PASSWORD:
_grantType = "password";
break;*/
case OAuthFlow.APPLICATION:
_grantType = "client_credentials";
break;
default:
break;
}
}
///
/// Creates an authentication parameter from an access token.
///
/// Access token to create a parameter from.
/// An authentication parameter.
protected override async ValueTask GetAuthenticationParameter(string accessToken)
{
var token = string.IsNullOrEmpty(Token) ? await GetToken() : Token;
return new HeaderParameter(KnownHeaders.Authorization, token);
}
///
/// Gets the token from the OAuth2 server.
///
/// An authentication token.
async Task GetToken()
{
var client = new RestClient(_tokenUrl)
.UseSerializer(() => new CustomJsonCodec(_serializerSettings, _configuration));
var request = new RestRequest()
.AddParameter("grant_type", _grantType)
.AddParameter("client_id", _clientId)
.AddParameter("client_secret", _clientSecret);
var response = await client.PostAsync(request);
return $"{response.TokenType} {response.AccessToken}";
}
}
}