2016-02-18 2 views
4

Я хотел бы добавить токен аутентификации в заголовок http-запроса каждый раз при отправке HTTP-запроса и если авторизация не удалась, я хочу перенаправить пользователя на логин. Должен ли я украсить драйвер Http или есть лучший способ сделать это?Как обращаться с токеном авторизации

Я пришел с решением, которое украшает http-драйвер. Но я не уверен, что это правильный способ сделать это. Вот код, я до сих пор написал:

import Rx from 'rx'; 
 
import {makeHTTPDriver} from '@cycle/http'; 
 

 
function makeSecureHTTPDriver({eager = false} = {eager: false}) { 
 

 
    return function secureHTTPDriver(request$) { 
 
     const httpDriver = makeHTTPDriver(eager); 
 

 
     const securedRequest$ = request$ 
 
      .map(request => { 
 
       const token = localStorage.getItem('token'); 
 

 
       if (token) { 
 
        request.headers = request.headers || {}; 
 
        request.headers['X-AUTH-TOKEN'] = token; 
 
       } 
 

 
       return request; 
 
      }); 
 

 
     const response$ = httpDriver(securedRequest$); 
 
     //todo: check response and if it fails, redirect to the login page 
 

 
     return response$; 
 
    } 
 
} 
 

 
export default makeSecureHTTPDriver;

Вот код, как я использую makeSecureHttpDriver

const drivers = { 
 
     DOM: makeDOMDriver('#app'), 
 
     HTTP: makeSecureHttpDriver() 
 
    };

ответ

1

Я не уверен, если это поможет, но HTTP-драйвер является суперагентом под капотом, поэтому вы можете передать ему объект, подобный запросу ired информация как here.

Но в отношении к вашему вопросу, я думаю, что HTTP driver может понадобиться этот параметр добавлен в драйвер это сам, так что вы можете диктовать, если водитель должен быть безопасным или нет, например:

const drivers = { 
    DOM: makeDOMDriver('#app'), 
    HTTP: makeSecureHttpDriver({secure:true}) 
}; 

Потому что ваши взгляды реализации хорошо для меня, возможно, стоит иметь его в самом драйвере. Я бы создал проблему в рефакторе HTTP-драйверов и посмотрел, что думает сообщество, вы также можете попросить людей взаимодействовать через gitter channel :-)

2

Это немного поздно, я не очень часто так много , Вместо этого я предлагаю использовать другие драйверы, чтобы не помещать какую-либо логику в ваши драйверы.

import storageDriver from '@cycle/storage' 
import {makeHTTPDriver} from '@cycle/http' 

function main(sources) { 
const {storage, HTTP} = sources 
const token$ = storage.local.getItem('token') 
    .startWith(null) 

const request$ = createRequest$(sources) 

const secureRequest$ = request$.withLatestFrom(token$, 
    (request, token) => token ? 
    Object.assign(request, {headers: {'X-AUTH-HEADER' : token }) : 
    request 
) 
return {HTTP: secureRequest$, ...} 
} 

Cycle.run(main, { 
... 
storage: storageDriver, 
HTTP: makeHTTPDriver() 
}) 
Смежные вопросы