I am trying to setup my authentication using the authorization_code
grant flow. I had it previously working with grant_type=password
, so I kind of know how the stuff is supposed to work. But when using grant_type=authorization_code
, I couldn't make it return anything other than invalid_grant
Here is my setup:
app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/auth/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(5),
Provider = new SampleAuthProvider()
});
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
AuthenticationType = "Bearer"
});
SampleAuthProvider is the following class: https://gist.github.com/anonymous/8a0079b705423b406c00
Basically, it's just logging every step and validating it. I tried the request:
POST http://localhost:12345/auth/token
grant_type=authorization_code&code=xxxxxx&client_id=xxxxx&redirect_uri=https://xxxx.com/
Content-Type: application/x-www-form-urlencoded
It's going through:
OnMatchEndpoint
OnValidateClientAuthentication
And that's all. I expected it to call OnValidateTokenRequest
and OnGrantAuthorizationCode
next, but it just didn't. I have no idea why.
The xxxx
's in the request aren't placeholders, I tried it like that. Maybe the middleware makes some checks on its own and rejects the request because of that? I tried variants of the redirect_uri
with http
, without any protocol, without trailing slash...
It also works properly with a custom grant_type
. It so if I too desperate, I guess I can use that to simulate authorization_code
, but I'd rather not have to do that.
TL;DR
My OAuthAuthorizationServerProvider
returns {"error":"invalid_grant"}
after OnValidateClientAuthentication
when using grant_type=authorization_code
.
- Why is it stopping there?
- How can I make the whole damn thing work?
Thanks for your help!
Edit
As pointed out by RajeshKannan, I made a mistake in my configuration. I didn't provide an AuthorizationCodeProvider
instance. However, that didn't completely solve the problem, since in my case, the code is not issued by the AuthorizationCodeProvider
, and I can't just deserialize it. I anwered with the workaround I got working.