Dúvida com relação ao token jwt

Boa noite, comecei a implementar o consumo da api de vcs em java, fiquei em dúvida com relação ao token jwt a ser utilizado. Esse token pode expirar em algum momento, ou eu posso gerar uma vez apenas com as credenciais e armazenar para usar em todas as chamadas dos endpoints?

Bom dia, @contato18.

Atualmente, os tokens gerados possuem validade de 30 dias, devendo ser armazenados e reutilizados enquanto ainda forem válidos. Recomendamos a sua renovação um pouco antes da sua expiração.

Mais detalhes em nossa documentação:

1 curtida

Perfeito, obrigado!

Bom dia. Já tentei de diversas formas gerar o token de acesso, mas só recebo um retorno 401. Algum detalhe que eu preciso informar além do grantType, clientId e clientSecret para ter autorização para gerar o token? Estou gerando requisições no java com okhttpclient3.

Verifique sempre o conteúdo da resposta, lá a API provê mais informações sobre o motivo do erro na requisição.

Boa tarde. Realmente não consigo obter o token de acesso. A resposta é sempre a mesma: Response{protocol=http/1.1, code=401, message=Unauthorized, url=https://auth.nuvemfiscal.com.br/oauth/token}. Não teria como fornecer um exemplo em java, como deve ser realizado essa requisição para dar certo a geração desse token?

Você conseguiu obter o corpo da resposta pra verificar melhor o motivo do erro?

Sim, o retorno é só o objeto response que citei na mensagem anterior. Code 401 e message unauthorized. É só isso o retorno da requisição. Precisava resolver isso com urgência, pois o início da operação da minha empresa está dependendo apenas disso. Se conseguir me ajudar com a maior celeridade possível, fico muito grato.

Boa noite, @contato18.

A resposta da API não é apenas essa. Favor reproduzir a requisição utilizando algum REST Client (Postman, Insomnia, Curl, etc) e nos enviar o conteúdo da resposta da API para que possamos lhe ajudar.

Certinho, Arimateia… Não estou na empresa agora, porém amanhã eu já realizo os testes e te dou um retorno. Por hora, muito obrigado.

Eis um exemplo:

~ % curl -X POST \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "SEU_CLIENT_ID:SEU_CLIENT_SECRET" \
  -d "grant_type=client_credentials" \
  -d "scope=empresa nfe" \
  https://auth.nuvemfiscal.com.br/oauth/token

{"error":"invalid_client","error_description":"Unknown client: SEU_CLIENT_ID"}%

Perceba que a API retorna na resposta o erro exato.

Só mais uma dúvida, pra eu já ter o máximo de informações possível para as tentativas de amanhã… Na documentação, fala que é necessário passar no body da requisição os campos: client_id , client_secret , grant_type e scope. Porém, no exemplo exposto, só mostra o parâmetro grant_type, com o valor client_credentials agrupando todas essas informações solicitadas anteriormente pela documentação. Qual o padrão do body eu devo enviar na requisição?

Todas essas informações estão no exemplo da mensagem anterior.

Então posso desconsiderar esse padrão que está sendo usado como exemplo na documentação: grant_type=client_credentials&client_id=abcdef&client_secret=123456&scope=cep%20cnpj%20nfse

E usar o padrão que você apresentou, com os parâmetros separados, correto?

O exemplo utiliza exatamente o mesmo padrão descrito na documentação. A diferença é apenas a forma como os parâmetros são passados na linha de comando do curl. No exemplo, eles aparecem em linhas separadas usando a opção -d múltiplas vezes, mas o corpo da requisição final é o mesmo. Ou seja, ambos os formatos resultam na mesma requisição HTTP.

Bom dia, Arimateia. Seguindo suas recomendações, consegui gerar o token JWT. Muito obrigado. Para gerar base de conhecimento, vou postar o modelo em JAVA que usei para efetuar a requisição do token com sucesso.

Map<String, String> dados = Map.of(
	"client_secret", "client_secret",
	"client_id","client_id",
	"grant_type","client_credentials",
	"scope","nfse"
);

String url = "https://auth.nuvemfiscal.com.br/oauth/token";

String body = "";

try {
	body = dados.entrySet().stream().map(entry -> {
		try {
			return String.format("%s=%s", entry.getKey(),
						URLEncoder.encode(entry.getValue(), StandardCharsets.UTF_8.toString()));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}).
		collect(Collectors.joining("&"));
}catch (Exception e) {
	// TODO: handle exception
	throw new Exception(e.getMessage());
}

HttpClient cliente = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url))..
			POST(HttpRequest.BodyPublishers.ofString(body)). 
			header("Content-Type", "application/x-www-form-urlencoded").build();

HttpResponse<String> response = cliente.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.statusCode());
System.out.println(response.body());
1 curtida

Este tópico foi fechado automaticamente 24 horas depois da última resposta. Novas respostas não são mais permitidas.