Modelo de Autenticação na Loja - Dotnet
Aqui você encontra um programa de modelo, escrito na linguagem C#
para servir de referência na implementação da autenticação da loja com suas credenciais e certificado digital eCNPJ padrão ICP Brasil do tipo PFX.
Aviso importante
O Consumer Key e Consumer Secret identificam seu usuário e seu contrato com o SERPRO. Mantenha essas informações protegidas.
Aplicação de Exibição
using Serpro.Componentes.AutenticacaoLoja;
var customerKey = "sua_customer_key";
var customerSecret = "sua_customer_secret";
var certificado = @"certificado.pfx";
var senha = "senha_do_certificado";
var tokensLojaSerpro = await LojaSerpro.GerarTokensTemporariosAsync(customerKey, customerSecret, certificado, senha);
Console.WriteLine($"expires_in (segundos): {tokensLojaSerpro.Expires_in}");
Console.WriteLine($"scope: {tokensLojaSerpro.Scope}");
Console.WriteLine($"token_type: {tokensLojaSerpro.Token_Type}");
Console.WriteLine($"access_token: {tokensLojaSerpro.Access_Token}");
Console.WriteLine($"jwt_token: {tokensLojaSerpro.Jwt_Token}");
Console.WriteLine();
/* Output:
expires_in: 1472
scope: am_application_scope default
token_type: Bearer
access_token: baa63388-2c05-3199-9721-6ac10c05976c
jwt_token: eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOi...
*/
Classe LojaSerpro.cs
Serpro.Componentes.AutenticacaoLoja
using System.Net.Http.Json;
using System.Net.Security;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
namespace Serpro.Componentes.AutenticacaoLoja;
public static class LojaSerpro
{
private const string ENDPOINT_LOJA_SERPRO = "https://autenticacao.sapi.serpro.gov.br/authenticate";
public static async Task<TokensLojaSerpro> GerarTokensTemporariosAsync(string consumerKey, string consumerSecret, string certificado, string senhaCertificado)
{
string autBase64 = EncodeBase64($"{consumerKey}:{consumerSecret}");
using HttpClientHandler httpClientHandler = AdicionarPfx(certificado, senhaCertificado);
using HttpClient client = new(httpClientHandler);
Uri uri = new(ENDPOINT_LOJA_SERPRO);
client.BaseAddress = uri;
HttpRequestMessage request = new(HttpMethod.Post, "authenticate");
request.Headers.Clear();
request.Headers.Add("Authorization", $"Basic {autBase64}");
request.Headers.Add("Role-Type", "TERCEIROS");
request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/json"); //CONTENT-TYPE header
Task<HttpResponseMessage> response = client.SendAsync(request);
return await response.Result.Content.ReadFromJsonAsync<TokensLojaSerpro>(OpcoesDesserializarJson);
}
private static HttpClientHandler AdicionarPfx(string certificado, string senha)
{
HttpClientHandler clientHandler = new();
X509Certificate2 certificadoPfx = new(certificado, senha);
clientHandler.SslProtocols = SslProtocols.Tls12;
clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
clientHandler.ClientCertificates.Add(certificadoPfx);
clientHandler.ServerCertificateCustomValidationCallback +=
(HttpRequestMessage req, X509Certificate2 cert2, X509Chain chain, SslPolicyErrors err) => { return true; };
return clientHandler;
}
private static JsonSerializerOptions OpcoesDesserializarJson
=> new() { PropertyNameCaseInsensitive = true };
private static string EncodeBase64(string str)
=> Convert.ToBase64String(Encoding.UTF8.GetBytes(str));
}
/// <summary>
/// Estrutura de dados com os dados dos Tokens.
/// </summary>
public record TokensLojaSerpro
{
[JsonPropertyName("expires_in")]
public int Expires_in { get; set; }
[JsonPropertyName("scope")]
public string Scope { get; set; }
[JsonPropertyName("token_type")]
public string Token_Type { get; set; }
[JsonPropertyName("access_token")]
public string Access_Token { get; set; }
[JsonPropertyName("jwt_token")]
public string Jwt_Token { get; set; }
}
Linguagem de programação
C# dotnet
Versão | Autor | Código-fonte |
---|---|---|
1.0.0 | SERPRO | Serpro.Componentes.AutenticacaoLoja.zip |
Certificado Digital
Utilizar o certificado digital de contratante eCNPJ padrão ICP Brasil.
Dependências
Pacotes importados via https://nuget.org em .Net 6.0
:
- microsoft.extensions.http
Créditos e Licença
Esse componente foi criado pelas equipes do SERPRO.
E foi utilizado licença MIT.