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:
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());
Este tópico foi fechado automaticamente 24 horas depois da última resposta. Novas respostas não são mais permitidas.