Ho creato una nuova soluzione WebAPI in Visual Studio e sto giocando con il codice per cercare di capire cosa sta succedendo.WebAPI2.0 Richiesta token OWIN con JSON
Ho un'API di test che funziona e funziona con un controller di autorizzazione e un altro controller che implementa tutte le funzionalità effettive.
Il controller (API) tutti i lavori ricevendo JSON e rispondere con JSON, con l'eccezione dei token/request.This deve essere:
Content-Type: application/x-www-form-urlencoded
altrimenti ottengo solo un errore di nuovo.
La sezione di codice che crea questo endpoint sembra essere questo:
OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new PathString("/Token"),
Provider = new ApplicationOAuthProvider(PublicClientId),
AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
// In production mode set AllowInsecureHttp = false
AllowInsecureHttp = false
};
Chiamarlo come questo si traduce in una risposta 200 successo, con un token al portatore:
$("#token_button").click(function()
{
var username = $("#token_email").val();
var password = $("#token_password").val();
postData("Token", "grant_type=password&username=" + username + "&password=" + password, "application/x-www-form-urlencoded", function (data)
{
user = data;
$("#feedback_display").html(user.access_token);
}, function()
{
user = null;
});
});
Chiamarlo come questo si traduce in una risposta 400:
$("#token_button").click(function()
{
var username = $("#token_email").val();
var password = $("#token_password").val();
var data = {
"grant_type": "password",
"username": username,
"password": password
}
postData("Token", JSON.stringify(data), "application/json", function (data)
{
user = data;
$("#feedback_display").html(user.access_token);
}, function()
{
user = null;
});
});
Il corpo di risposta è:
{"error":"unsupported_grant_type"}
L'unica differenza qui è la codifica utilizzata per trasmettere la richiesta. Ogni dove guardo tutti gli esempi utilizzano la codifica del modulo per richiedere questo token.
Posizionare un punto di interruzione sul codice sotto/api/Account/ExternalLogin, non viene colpito.
C'è un motivo per questo solo accettando la codifica del modulo? e se no, come posso cambiare il controller per accettare JSON?
In alternativa ho appena fatto qualcosa di stupido?
Non c'è bisogno di 'JSON.stringify (dati)' –
Grazie a @gauravbhavsar che funziona ora. Se lo pubblichi come risposta, segnerò è corretto. Immagino che sollevi la domanda perché devo JSON.stringify i dati inviati agli altri endpoint ma non quello? L'ho appena testato e ne ho bisogno. Farò una ricerca e vedrò se non riesco a risolverlo. – Morvael