perf(admin): 整理admin鉴权相关的逻辑并强化对于token过期的处理

pull/70/head
moonrailgun 2 years ago
parent 6dcfd647f5
commit 998e7a6707

@ -1,13 +1,6 @@
import { import { Admin, Resource, ShowGuesser, CustomRoutes } from 'react-admin';
Admin,
Resource,
fetchUtils,
ShowGuesser,
CustomRoutes,
TranslationMessages,
} from 'react-admin';
import jsonServerProvider from 'ra-data-json-server'; import jsonServerProvider from 'ra-data-json-server';
import { authProvider, authStorageKey } from './authProvider'; import { authProvider } from './authProvider';
import { UserList } from './resources/user'; import { UserList } from './resources/user';
import React from 'react'; import React from 'react';
import { GroupList, GroupShow } from './resources/group'; import { GroupList, GroupShow } from './resources/group';
@ -23,22 +16,7 @@ import { Route } from 'react-router-dom';
import { TailchatNetwork } from './network'; import { TailchatNetwork } from './network';
import { TailchatLayout } from './layout'; import { TailchatLayout } from './layout';
import { i18nProvider } from './i18n'; import { i18nProvider } from './i18n';
import { httpClient } from './request';
const httpClient: typeof fetchUtils.fetchJson = (url, options = {}) => {
try {
if (!options.headers) {
options.headers = new Headers({ Accept: 'application/json' });
}
const { token } = JSON.parse(
window.localStorage.getItem(authStorageKey) ?? '{}'
);
(options.headers as Headers).set('Authorization', `Bearer ${token}`);
return fetchUtils.fetchJson(url, options);
} catch (err) {
return Promise.reject();
}
};
const dataProvider = jsonServerProvider( const dataProvider = jsonServerProvider(
// 'https://jsonplaceholder.typicode.com' // 'https://jsonplaceholder.typicode.com'

@ -14,6 +14,7 @@ export const authProvider: AuthProvider = {
return response.json(); return response.json();
}) })
.then((auth) => { .then((auth) => {
console.log(auth);
localStorage.setItem(authStorageKey, JSON.stringify(auth)); localStorage.setItem(authStorageKey, JSON.stringify(auth));
}) })
.catch(() => { .catch(() => {
@ -24,8 +25,19 @@ export const authProvider: AuthProvider = {
localStorage.removeItem(authStorageKey); localStorage.removeItem(authStorageKey);
return Promise.resolve(); return Promise.resolve();
}, },
checkAuth: () => checkAuth: () => {
localStorage.getItem(authStorageKey) ? Promise.resolve() : Promise.reject(), const auth = localStorage.getItem(authStorageKey);
if (auth) {
try {
const obj = JSON.parse(auth);
if (obj.expiredAt && Date.now() < obj.expiredAt) {
return Promise.resolve();
}
} catch (err) {}
}
return Promise.reject();
},
checkError: (error) => { checkError: (error) => {
const status = error.status; const status = error.status;
if (status === 401 || status === 403) { if (status === 401 || status === 403) {

@ -1,6 +1,7 @@
import axios from 'axios'; import axios from 'axios';
import { authStorageKey } from './authProvider'; import { authStorageKey } from './authProvider';
import _set from 'lodash/set'; import _set from 'lodash/set';
import { fetchUtils } from 'react-admin';
/** /**
* *
@ -27,3 +28,19 @@ function createRequest() {
} }
export const request = createRequest(); export const request = createRequest();
export const httpClient: typeof fetchUtils.fetchJson = (url, options = {}) => {
try {
if (!options.headers) {
options.headers = new Headers({ Accept: 'application/json' });
}
const { token } = JSON.parse(
window.localStorage.getItem(authStorageKey) ?? '{}'
);
(options.headers as Headers).set('Authorization', `Bearer ${token}`);
return fetchUtils.fetchJson(url, options);
} catch (err) {
return Promise.reject();
}
};

@ -1,7 +1,7 @@
import { Router } from 'express'; import { Router } from 'express';
import raExpressMongoose from 'express-mongoose-ra-json-server'; import raExpressMongoose from 'express-mongoose-ra-json-server';
import jwt from 'jsonwebtoken'; import jwt from 'jsonwebtoken';
import { adminAuth, auth, authSecret } from '../middleware'; import { adminAuth, auth, authSecret } from '../middleware/auth';
import { networkRouter } from './network'; import { networkRouter } from './network';
const router = Router(); const router = Router();
@ -30,6 +30,7 @@ router.post('/login', (req, res) => {
res.json({ res.json({
username, username,
token: token, token: token,
expiredAt: new Date().valueOf() + 2 * 60 * 60 * 1000,
}); });
} else { } else {
res.status(401).end('username or password incorrect'); res.status(401).end('username or password incorrect');

@ -4,7 +4,7 @@
import { Router } from 'express'; import { Router } from 'express';
import { broker } from '../broker'; import { broker } from '../broker';
import { auth } from '../middleware'; import { auth } from '../middleware/auth';
import _ from 'lodash'; import _ from 'lodash';
const router = Router(); const router = Router();

@ -21,6 +21,7 @@
"migrate:up": "migrate-mongo up -f ./scripts/migrate-mongo-config.js", "migrate:up": "migrate-mongo up -f ./scripts/migrate-mongo-config.js",
"docker:build": "node ./scripts/buildDocker.js", "docker:build": "node ./scripts/buildDocker.js",
"dashboard": "ts-node ./scripts/dashboard.ts", "dashboard": "ts-node ./scripts/dashboard.ts",
"admin": "cd admin && pnpm run build && pnpm run start",
"plugin:install": "node ./scripts/installPlugin.js", "plugin:install": "node ./scripts/installPlugin.js",
"protobuf": "proto-loader-gen-types --longs=String --enums=String --defaults --oneofs --grpcLib=@grpc/grpc-js --outDir=proto/ proto/*.proto", "protobuf": "proto-loader-gen-types --longs=String --enums=String --defaults --oneofs --grpcLib=@grpc/grpc-js --outDir=proto/ proto/*.proto",
"gen:swagger": "ts-node ./scripts/swagger.ts" "gen:swagger": "ts-node ./scripts/swagger.ts"

Loading…
Cancel
Save