2017-02-03 7 views
0

Я хочу позвонить Token Endpoint IdentityServer 4 из моего приложения React (работает на http://localhost:3000). Так что в какой-то метод входа в систему я делаю:Вызов Identity Server Token EndPoint

login =() => { 
    const userdata = { 
     username: 'admin', 
     password: 'admin', 
    }; 
    const dataForBody = `${'client_id=js&'}${'grant_type=password&' + 
     'username='}${encodeURI(userdata.username)}&` + 
     `password=${encodeURI(userdata.password)}&` + 
     `scope=${encodeURI('api1')}`; 

    const messageHeaders = { 
     'Content-Type': 'application/x-www-form-urlencoded', 
    }; 

    axios({ 
     method: 'post', 
     url: 'http://localhost:5000/connect/token', 
     headers: messageHeaders, 
     data: dataForBody, 
    }) 
     .then((response) => { 
     console.log(response); 
     }); 
    } 

Теперь я получаю следующий ответ:

{"error":"unauthorized_client"} 

Мои IdSrv создать что-то вроде образца приложения JS.

config.cs

namespace QuickstartIdentityServer 
{ 
    public class Config 
    { 
     // scopes define the API resources in your system 
     public static IEnumerable<ApiResource> GetApiResources() 
     { 
      return new List<ApiResource> 
      { 
       new ApiResource("api1", "My API") 
      }; 
     } 

     // client want to access resources (aka scopes) 
     public static IEnumerable<Client> GetClients() 
     { 
      return new List<Client> 
      { 
       new Client 
       { 
        ClientId = "js", 
        ClientName = "JavaScript Client", 
        AllowedGrantTypes = GrantTypes.Implicit, 
        AllowAccessTokensViaBrowser = true, 

        RedirectUris =   { "http://localhost:3000/login" }, 
        AllowedCorsOrigins =  { "http://localhost:3000" }, 

        AllowedScopes = 
        { 
         IdentityServerConstants.StandardScopes.OpenId, 
         IdentityServerConstants.StandardScopes.Profile, 
         "api1" 
        } 
       } 
      }; 
     } 

     public static List<TestUser> GetUsers() 
     { 

      return new List<TestUser> { 
       new TestUser { 
        SubjectId = "1", Username = "admin", Password = "admin" 
       }, 
      }; 

     } 

    } 
} 

startup.cs

namespace QuickstartIdentityServer 
{ 
    public class Startup 
    { 
     public void ConfigureServices(IServiceCollection services) 
     { 
      // configure identity server with in-memory stores, keys, clients and scopes 
      services.AddIdentityServer() 
       .AddTemporarySigningCredential() 
       .AddInMemoryApiResources(Config.GetApiResources()) 
       .AddInMemoryClients(Config.GetClients()) 
       .AddTestUsers(Config.GetUsers()); 
     } 

     public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddConsole(LogLevel.Debug); 
      app.UseDeveloperExceptionPage(); 

      app.UseIdentityServer(); 
     } 
    } 
} 

ли я что-то отсутствует?

ответ

2

Проблема заключается в определении клиента:

AllowedGrantTypes = GrantTypes.Implicit, 

Неправильная версия. Мы должны использовать вместо этого:

AllowedGrantTypes = ResourceOwnerPassword 
1

Непосредственная проблема, которая выпрыгивает, заключается в том, что вы пытаетесь выполнить аутентификацию с помощью службы токенов, передав имя пользователя и пароль в качестве параметров URL. имя пользователя и пароль клиента должны быть переданы при помощи стандартного базового заголовка авторизации:

Authorization: Basic Base64Encode(myusername:mypassword) 

Что для этого примера будет в конечном итоге выглядит так:

Authorization: Basic bXl1c2VybmFtZTpteXBhc3N3b3Jk 
+0

Здравствуйте, спасибо за ответ. Теперь я добавил 'Авторизация: Basic $ btoa ('admin: admin')' удалил имя пользователя и пароль из тела, и теперь он говорит мне: 'invalid_client' – FacundoGFlores

+0

Я бы посмотрел на фактический запрос, сгенерированный с помощью Chrome инструменты разработчика (вкладка «Сеть») или что-то вроде Postman. Убедитесь, что параметры вашей формы закодированы так, как вы ожидаете. Одна из проблем может привести к отбрасыванию всего набора параметров. – Patrick

Смежные вопросы