无法为Apollo客户端设置身份验证标头

时间:2018-05-07 09:36:36

标签: jwt graphql apollo

我正在使用在客户端使用React和Redux的Laravel应用程序,使用React预设和Mix。我决定尝试使用GraphQL来代替API,而不是通常的REST API方法,到目前为止它的工作正常。但是,我现在卡住了。

我正在使用Apollo作为我的HTTP客户端,因为它是为使用GraphQL而构建的。在过去,我使用JWT Auth来保护API,所以我自然也采用了这种方法,因为实现只是添加一个合适的标头。我跟着the instruction on setting headers with Apollo,但标题没有设置。这是有问题的JS文件:

import LinkList from './components/LinkList';
import React from 'react';
import ReactDOM from 'react-dom';
import {Container} from './container';
import {createStore} from 'redux';
import reducer from './reducer';
import {Provider} from 'react-redux';
import {fromJS} from 'immutable';
import ApolloClient from 'apollo-boost';
import gql from 'graphql-tag';
import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';

const httpLink = createHttpLink({
    uri: window.initialData.graphql_route
});

const authLink = setContext((_, { headers }) => {
    const token = window.initialData.jwt;
    // return the headers to the context so httpLink can read them
    return {
        headers: {
            ...headers,
            authorization: token ? `Bearer ${token}` : "",
        }
    }
});

const client = new ApolloClient({
    link: authLink.concat(httpLink),
    cache: new InMemoryCache()
});

client.query({
    query: gql`{
        links {
            id
            title
            link
        }}`
}).then(result => console.log(result));

const store = createStore(
    reducer,
    fromJS(window.initialData),
    window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
);

if (document.getElementById('list')) {
    ReactDOM.render(
        <Provider store={store}>
            <Container />
        </Provider>,
        document.getElementById('list')
    );
}

我在视图中填充window.initialData,其中包含必要的数据,包括JWT标记window.initialData.jwt。在authLink定义中设置断点不会做什么,这意味着它永远不会被调用。

知道出了什么问题吗?我已经非常仔细地遵循了文档中的示例,所以我能想到的是它们可能会被约会。

1 个答案:

答案 0 :(得分:8)

您正在使用来自&#39; apollo-boost&#39;的ApolloClient,但您的令牌配置适用于另一个ApolloClient,来自&#39; apollo-client&#39的{ApolloClient}。

如果你想使用apollo-boost中的ApolloClient保存令牌:

$result = Bookings::where('start_date', '<=' $request->start_date)->where('end_date', '>=' $request->end_date)->where('room_id',$request->room_id)->first();
if(!$result){
  // Code to Book room
}

Apollo Boost migration