All checks were successful
Build, Push and Run Container / build (push) Successful in 23s
Replaces the default document retriever with a custom implementation. This change simplifies the configuration by embedding the HTTP document retriever directly within the custom retriever, and centralizes the URL replacement logic for Tesla's OIDC configuration. This avoids injecting the HttpDocumentRetriever into the TeslaDocumentRetriever constructor and makes the code more maintainable.
47 lines
2.0 KiB
C#
47 lines
2.0 KiB
C#
using System.Collections.Concurrent;
|
|
using System.IdentityModel.Tokens.Jwt;
|
|
using Microsoft.IdentityModel.Protocols;
|
|
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
namespace ProofOfConcept.Utilities;
|
|
|
|
using Microsoft.IdentityModel.Protocols;
|
|
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
|
|
|
|
public sealed class TeslaOIDCConfigurationManager : IConfigurationManager<OpenIdConnectConfiguration>
|
|
{
|
|
private readonly IConfigurationManager<OpenIdConnectConfiguration> _inner;
|
|
|
|
public TeslaOIDCConfigurationManager(string metadataAddress)
|
|
{
|
|
_inner = new ConfigurationManager<OpenIdConnectConfiguration>(metadataAddress, new OpenIdConnectConfigurationRetriever(), new TeslaDocumentRetriever());
|
|
}
|
|
|
|
public async Task<OpenIdConnectConfiguration> GetConfigurationAsync(CancellationToken cancel)
|
|
{
|
|
OpenIdConnectConfiguration? configuration = await _inner.GetConfigurationAsync(cancel);
|
|
|
|
string cloudEndpointBase = "https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3";
|
|
configuration.AuthorizationEndpoint = $"{cloudEndpointBase}/authorize";
|
|
configuration.TokenEndpoint = $"{cloudEndpointBase}/token";
|
|
configuration.JwksUri = $"{cloudEndpointBase}/discovery/thirdparty/keys";
|
|
configuration.EndSessionEndpoint = $"{cloudEndpointBase}/logout";
|
|
configuration.UserInfoEndpoint = $"{cloudEndpointBase}/userinfo";
|
|
|
|
return configuration;
|
|
}
|
|
|
|
public void RequestRefresh() => _inner.RequestRefresh();
|
|
}
|
|
|
|
public class TeslaDocumentRetriever : IDocumentRetriever
|
|
{
|
|
private readonly HttpDocumentRetriever httpDocumentRetriever = new HttpDocumentRetriever();
|
|
|
|
public async Task<string> GetDocumentAsync(string address, CancellationToken cancel)
|
|
{
|
|
string document = await this.httpDocumentRetriever.GetDocumentAsync(address, cancel);
|
|
return document.Replace("https://fleet-auth.tesla.com/oauth2/v3", "https://fleet-auth.prd.vn.cloud.tesla.com/oauth2/v3");
|
|
}
|
|
} |