Ir para o conteúdo

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.