【发布时间】:2020-09-11 19:05:53
【问题描述】:
我正在开发一个应用程序,我使用 React 作为我的前端,React-apollo-graphql 用于我的 API 调用。
我正在使用react-hooks,即在 React 16.8 + 中。
我在做什么
我已经创建了一个 auth.js 文件,当用户登录时我在其中存储我的值并检查令牌是否有效(我正在检查到期),但该文件仅加载我正在刷新或重新加载页面,这不是应该的工作方式
我的 auth.js 文件
const initialstate = {
user: null,
};
if (localStorage.getItem("JWT_Token")) {
const jwt_Token_decoded = Jwt_Decode(localStorage.getItem("JWT_Token"));
console.log(jwt_Token_decoded.exp * 1000);
console.log(Date.now());
if (jwt_Token_decoded.exp * 1000 < Date.now()) {
localStorage.clear(); // this runs only when I refresh the page or reload on route change it dosent work
} else {
initialstate.user = jwt_Token_decoded;
}
}
const AuthContext = createContext({
user: null,
login: (userData) => {},
logout: () => {},
});
const AuthReducer = (state, action) => {
switch (action.type) {
case "LOGIN":
return {
...state,
user: action.payload,
};
case "LOGOUT":
return {
...state,
user: null,
};
default:
return state;
}
};
const AuthProvider = (props) => {
const [state, dispatch] = useReducer(AuthReducer, initialstate);
const login = (userData) => {
localStorage.setItem("JWT_Token", userData.token);
dispatch({
type: "LOGIN",
payload: userData,
});
};
const logout = () => {
localStorage.clear();
dispatch({ action: "LOGOUT" });
};
return (
<AuthContext.Provider
value={{ user: state.user, login, logout }}
{...props}
/>
);
};
export { AuthContext, AuthProvider };
正如我已经评论了我正在检查令牌到期的行。
我唯一的问题是为什么它在页面重新加载上工作,而不是像我们在使用 Redux 时在存储文件中所做的那样在每个路由上工作。
我的 App.js
<AuthProvider>
<Router>
<div className="App wrapper">
<Routes/>
</div>
</Router>
</AuthProvider>
我的 index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import ApolloClient from 'apollo-boost'
import { ApolloProvider } from '@apollo/react-hooks';
import { InMemoryCache } from 'apollo-cache-inmemory';
const client = new ApolloClient({
uri: 'my url',
cache: new InMemoryCache(),
});
ReactDOM.render(
<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById('root')
);
要点
当我使用react-apollo-graphql 时,他们是否提供 ant 身份验证流程?就像 redux 一样,我们必须创建一个存储文件来存储我们的数据
我使用的是 React 16.8 +,所以我使用的是 react-hooks,所以这里我只使用 use Reducer。
我唯一的问题是我做得对吗?我对其他方法持开放态度。
我已经使用 Vuex 在 Vue 中完成了身份验证和授权,我用它来创建一个在任何路线上运行的商店文件
与 Redux 一样,在我的存储文件中我用来存储状态和所有内容。
现在,如果我使用 react-hooks 和 react-apollo-graphql,那么就不需要使用 redux 来做这些事情了。
我正在使用apollo-link-context 传递如下所示的标头(授权)
const authLink = setContext(() => {
const token = localStorage.getItem('JWT_Token')
return {
headers:{
Authorization: token ? `${token}` : ''
}
}
});
我认为在这里我可以检查每个路由或每个请求是否令牌有效(检查 exp 时间)如果它无效然后我将注销并清除我的本地存储,清除存储不是什么大问题主要是如何重定向到登录页面。
【问题讨论】:
标签: javascript reactjs graphql react-hooks react-apollo