2017-02-06 14 views
1

У меня есть настройка, в которой у меня есть API 4 рельсов, имеющий gem devise_token_auth и размещаемый как отдельное приложение, поэтому у меня также есть стойки, настроенные на обрабатывать запросы перекрестного происхождения. Используя angular2-token на моем лицевом конце Angular 2 applicaiton, я смог успешно зарегистрироваться и войти в систему, а также выйти из пользователей через мой API. Проблема, с которой я столкнулся, возникает только тогда, когда пользователь вступил в систему, и после обновления браузера я получаю эту ошибку в консоли API rails, а также в браузере, отмеченном как в firefox, так и в chrome.rails 4 API дает 401 неутешительный ответ после успешного входа в систему с использованием пакета углового2-токена

Started GET "/api/v1/auth/validate_token" for 127.0.0.1 at 2017-02-06 17:42:49 +0500 
Processing by DeviseTokenAuth::TokenValidationsController#validate_token as JSON 

следует

SELECT "users".* FROM "users" WHERE "users"."uid" = $1 LIMIT 1 [["uid", "[email protected]"]] 
Completed 401 Unauthorized in 76ms (Views: 0.2ms | ActiveRecord: 0.3ms) 

Моего исходным допущения при конфигурировании этого пакета в моем приложении Angular2 было то, что он будет неявно включать заголовки аутентификации в каждом запросе. Однако после многократного прохождения документации gem я также добавил заголовки самостоятельно, когда я инициализирую службу токена в файле app.component.ts.

this._tokenService.init({ 
apiPath: API_PATH, 
    globalOptions: { 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
     "access_token_name": localStorage.getItem('accessToken'), 
     "client_name": localStorage.getItem('client'), 
     "uid_name": localStorage.getItem('uid') 
    } 
    } 
}); 

Даже после того, что ответ не изменился на запрос, и я не смог получить эти заголовки на стороне сервера, а также.

Однако после нескольких часов осмотра мне пришла в голову идея, которая должна была проверять заголовки m на сервере, и когда я использовал запрос ruby.header.inspect в своем конечном приложении на сервере, я получаю следующий вывод с необходимой информацией для проверки маркеров, но это, кажется, что название ключей этих значений заголовков разных форм, что devise_token_auth ожидает проверки маркеров (я прошел через источник devise_auth_token жемчужины here.

"HTTP_ACCESS_TOKEN_NAME"=>"xxxxxxxxxxxxxxxxxx", "HTTP_EXPIRY"=>"xxxxxxxxxxxxxxxxxx", "HTTP_UID"=>"[email protected]", "HTTP_CLIENT_NAME"=>"xxxxxxxxxxxxxxxxxx", "HTTP_TOKEN_TYPE"=>"Bearer" 

что я считаю, пользователь не устанавливается с помощью devise_token_auth gem на основе передаваемых заголовков.

После многократного просмотра документации Angular2-token, а также devise_token_auth gem. Я смущен, вручную или нет, добавлять заголовки для проверки подлинности вручную, поскольку я считаю, что они уже переданы, но с разными ключами. Я просто хотел бы знать, если это так, я переживаю его почти полный день, и я не могу понять, как указать причину ответа 401.

Большое спасибо.

EDITED:

Кроме того я также получаю ноль при доступе к CURRENT_USER или любой помощник DEViSE после успешного знака на стороне сервера.

Здесь приведена конфигурация стойки для моего устройства api rails. приложение.Р.Б.

config.middleware.use Rack::Cors do 
    allow do 
    origins '*' 
    resource '/cors', 
     :headers => :any, 
     :methods => [:post], 
     :credentials => true, 
     :max_age => 0 
    resource '*', 
     :headers => :any, 
     :expose => ['access-token', 'expiry', 'token-type', 'uid', 'client'], 
     :methods => [:get, :post, :options, :delete, :put] 
    end 
end 

Заголовки, которые я получаю от проверки следующие:

  1. HTTP_ACCESS_TOKEN
  2. HTTP_CLIENT
  3. HTTP_EXPIRY
  4. HTTP_TOKEN_TYPE
  5. HTTP_UID

Это отправленные заголовки, даже если я не упоминаю заголовки при настройке пакета углового2-токена.

Я смущен, почему он позволяет мне войти в систему, в первую очередь, а затем выдаст ошибку с 401 кодом и реакции

{"success":false,"errors":["Invalid login credentials"]} 

При попытке вручную проверить проверки лексемы, используя следующий код

this._tokenService.validateToken().subscribe(
    res =>  console.log(res), 
    error => console.log(error) 
); 

ответ

0

Вы также должны пройти Expiry и Token-type запросов для devise_token_auth аутентификации, что-то вроде этого:

let headers = new Headers(); 

headers.append('Content-Type', 'application/json'); 
headers.append('Uid', this.uid); 
headers.append('Client', this.client); 
headers.append('Access-Token', this.access_token); 
headers.append('Expiry', this.expiry); 
headers.append('Token-Type', 'Bearer'); 

this.http.post('http://my-api.com/', JSON.stringify(resource), {headers: header}).subscribe((res)=>{ 
    #Your Logic Here 
}); 

Этот пример предназначен для общих HTTP-запросов, но вы можете применить это правило к своему плагину с угловым токеном. т.е. .:

this._tokenService.init({ 
apiPath: API_PATH, 
    globalOptions: { 
    headers: { 
     'Content-Type': 'application/json', 
     'Accept': 'application/json', 
     "access_token_name": localStorage.getItem('accessToken'), 
     "client_name": localStorage.getItem('client'), 
     "uid_name": localStorage.getItem('uid'), 
     "expiry_name": localStorage.getItem('expiry'), 
     "token-type_name': 'Bearer' 
    } 
    } 
}); 

Вы установили пользовательские заголовки имя devise_token_auth? Первый пример работает с конфигурацией по умолчанию, без _name в конце имен заголовков, вы должны попробовать изменить, если это так.

+0

Спасибо большое за ответ! Я попробую это правильно! – Hassan

+0

На самом деле я пробовал эти изменения раньше, но не повезло. Даже если я не передаю заголовки вообще в глобальных параметрах, после проверки заголовков на сервере я получаю эти значения, но с разными ключами, как я упомянул в своем вопросе. Имеет ли он что-либо с конфигурациями стойки на моем сервере или что-то еще? Кроме того, я также получаю ноль при доступе к current_user или любому помощнику при создании после успешного входа на сервер. – Hassan

+0

Вы разоблачили свои заголовки в конфигурации CORS? Обратитесь к этому https: // github.com/lynndylanhurley/devise_token_auth # cors – ErvalhouS

0

Проведя несколько дней по этой проблеме и рассмотрев несколько тем связанных вопросов, неоднократно размещенных по смежным темам, я столкнулся с проблемой following, и я понял, что у меня есть рельсы 4, и я использовал rails-api gem для создания моего API. После этого я создал рельсы 5 API с --api варианта (без рельсов-апи драгоценный камень) и с devise_token_auth и стоечных-CORS на моем конце апите я был успешным в отправке авторизованного запроса с использованием angular2- токен упаковка. Наряду с этим я также мог отправлять разрешенные HTTP-запросы с заголовками доступа к авторизации, токеном типа, expiry, uid, как указано в документации devem_token_auth gem.

Возможно, это не точное решение, или я, возможно, не определил причину проблемы, но это было для меня.