Nesse post eu mostro a solução encontrada para um problema, que não está descrito na documentação do Identity Server 4 - Token Endpoint.
Problema:
Ao seguir a documentação e tentar obter um token válido no endpoint /connect/token
recebo o seguinte retorno:
warn: IdentityServer4.Endpoints.TokenEndpoint[0]
Invalid HTTP request for token endpoint
Para testar a obtenção de um token válido, utilizei o Postman, com uma request do tipo POST conforme a seguir:
Veja que o retorno foi um erro:
{
"error": "invalid_request"
}
No servidor, esse é o client que foi inicializado no Identity Server 4:
// resource owner password grant client
clientList.Add(
new Client {
ClientId = "ro.client",
AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
ClientSecrets = {
new Secret("t%n6CFC$h4XckGRna%=c2xrECt9M8v)NbF>)}x*9sF6ka3prLj.ozo3HELTGYPm9".Sha256())
},
AllowedScopes = {
"openid",
"apiErp.access",
"apiControlPanel.access"
},
AllowOfflineAccess = true
}
);
O estranho é que antes de atualizar o Identity Server 4 para a versão mais recente, estava funcionando perfeitamente essa request.
Solução:
Troquei o content-type da request de: form-data para: x-www-form-urlencoded.
Feito isso o resultado:
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjA4QkEyN0M0MUU4MTJBQUZGMjcyN0ExMEM5RTVCRERFIiwidHlwIjoiYXQrand0In0.eyJuYmYiOjE1OTY0NzY5MzYsImV4cCI6MTU5NjQ4MDUzNiwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMCIsImF1ZCI6ImFwaUVycCIsImNsaWVudF9pZCI6InJvLmNsaWVudCIsInN1YiI6IkFwcFVzZXJzL2dhYnJpZWxyYi5uZXRAZ21haWwuY29tIiwiYXV0aF90aW1lIjoxNTk2NDc2OTM2LCJpZHAiOiJsb2NhbCIsImp0aSI6IjZGNzRBNUYxRURBQzM3NDAzQTMwMTA0NUZDMzgyRjcwIiwiaWF0IjoxNTk2NDc2OTM2LCJzY29wZSI6WyJhcGlFcnAuYWNjZXNzIl0sImFtciI6WyJwd2QiXX0.dms9yFDZk7mTxovGsVxtHVokJBOieAbygovMdlLsoOqY_MsZ-kLxs-OHovrel_sHuBnaZhZG4FnwhV429-otQ-7jDCWGYKMIzscoLjx3DgQKQGFTXZJ-StU3qqYJYsYyGrtaUfQE7D3QXjBL6WCfdeuf2or8b1HABXIR4-GRhvhSvQwZpiApdTi30iKpbDHB_aLJyqmOo_IjiO1A78tdgq60ydbyyPsPrqfwh5yghDs8ZlE77JBKOzyWxqDRhFey_0wBVx37rbnV4UMyJ_rnVyM7Vn4tm5_0Un34uzCoS_jyehxv28bEOH_K1BR60rEmFArexKNolTC9OGCPjDTslQ",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "apiErp.access"
}
Foi então que resolvi checar a documentação de referência do OpenId, e encontrei na especificação o seguinte modelo de request:
POST /token HTTP/1.1
Host: server.example.com
👉Content-Type: application/x-www-form-urlencoded
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient.example.org%2Fcb
Vou tentar editar a documentação oficial do Identity Server 4, incluindo essa informação sobre o content type.
Espero que tenha te ajudado.
Valeu.
Top comments (2)
No meu caso estava configurando .AddInMemoryApiResources() tive que troca para .AddInMemoryApiScopes().
Muuuuito obrigado! Nenhum lugar achei documentado que a API do IdentityServer era via x-form-urlencoded