update refresh token
This commit is contained in:
parent
94837efdee
commit
d11f1a053b
@ -4,12 +4,12 @@ const util = require('util')
|
||||
const joi = require('joi')
|
||||
const response = require('src/utils/response/index.js')
|
||||
const config = require('src/config/index.js')
|
||||
const { jwt } = require('src/utils/pkgs.js')
|
||||
const sso = require('src/utils/sso/index.js')
|
||||
const { copyObject } = require('src/utils/index.js')
|
||||
const { get: getCacheInstance } = require('src/utils/cache.js')
|
||||
|
||||
const { Success, InternalError, DataFormat, Forbidden, Unauthorized } = response.resp
|
||||
const { Success, InternalError, DataFormat, Unauthorized } =
|
||||
response.resp
|
||||
|
||||
const controller = {}
|
||||
module.exports = controller
|
||||
@ -56,8 +56,8 @@ controller.apiHandler = () => async (ctx, next) => {
|
||||
ctx.resp = responseFunc.bind(ctx)
|
||||
ctx.err = responseError
|
||||
|
||||
ctx.getBody = key => (ctx.request.body || {})[key]
|
||||
ctx.getFile = key => (ctx.request.files || {})[key]
|
||||
ctx.getBody = (key) => (ctx.request.body || {})[key]
|
||||
ctx.getFile = (key) => (ctx.request.files || {})[key]
|
||||
|
||||
// run next
|
||||
try {
|
||||
@ -87,16 +87,32 @@ controller.apiHandler = () => async (ctx, next) => {
|
||||
* data validate middleware
|
||||
* @param {{query?: any, header?: any, body?: any}} schema body,query and header is joi.Schema
|
||||
*/
|
||||
controller.validate = schema => {
|
||||
controller.validate = (schema) => {
|
||||
if (typeof schema !== 'object') responseError(InternalError)
|
||||
const v = {}
|
||||
if ('body' in schema) v.body = joi.isSchema(schema.body) ? schema.body : joi.object(schema.body).unknown()
|
||||
if ('header' in schema) v.header = joi.isSchema(schema.header) ? schema.header : joi.object(schema.header).unknown()
|
||||
if ('query' in schema) v.query = joi.isSchema(schema.query) ? schema.query : joi.object(schema.query).unknown()
|
||||
if ('body' in schema) {
|
||||
v.body = joi.isSchema(schema.body)
|
||||
? schema.body
|
||||
: joi.object(schema.body).unknown()
|
||||
}
|
||||
if ('header' in schema) {
|
||||
v.header = joi.isSchema(schema.header)
|
||||
? schema.header
|
||||
: joi.object(schema.header).unknown()
|
||||
}
|
||||
if ('query' in schema) {
|
||||
v.query = joi.isSchema(schema.query)
|
||||
? schema.query
|
||||
: joi.object(schema.query).unknown()
|
||||
}
|
||||
|
||||
return async (ctx, next) => {
|
||||
try {
|
||||
await joi.object(v).unknown().validateAsync({ query: ctx.query, header: ctx.headers, body: ctx.request.body })
|
||||
await joi.object(v).unknown().validateAsync({
|
||||
query: ctx.query,
|
||||
header: ctx.headers,
|
||||
body: ctx.request.body
|
||||
})
|
||||
} catch (err) {
|
||||
debug(`data validate error: ${util.inspect(err, false, null)}`)
|
||||
responseError(DataFormat)
|
||||
@ -106,7 +122,6 @@ controller.validate = schema => {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {boolean=} allowExpired
|
||||
* @return {import('koa').Middleware}
|
||||
*/
|
||||
controller.authorization = () => {
|
||||
@ -120,18 +135,21 @@ controller.authorization = () => {
|
||||
try {
|
||||
const strs = token.split(/\s/)
|
||||
debug(`Get Header: ${token}`)
|
||||
if (strs.length !== 2 || !/^bearer$/i.test(strs[0])) ctx.err(Unauthorized, response.codeMessage.CodeTokenInvalid);
|
||||
if (strs.length !== 2 || !/^bearer$/i.test(strs[0])) { ctx.err(Unauthorized, response.codeMessage.CodeTokenInvalid) }
|
||||
|
||||
[, ctx.token.origin] = strs
|
||||
|
||||
const decoded = {}
|
||||
const cache = getCacheInstance()
|
||||
// cache not exists
|
||||
if (!cache.get(ctx.token.origin)) ctx.err(Unauthorized)
|
||||
|
||||
try {
|
||||
// 可以考慮這邊做個cache 多久之內存取不會到keycloak驗證
|
||||
let userInfo = await sso.getUserInfo(ctx.token.origin)
|
||||
if (!userInfo) {
|
||||
// try refresh
|
||||
const cache = getCacheInstance()
|
||||
const oldToken = ctx.token.origin
|
||||
const refreshToken = cache.get(ctx.token.origin)
|
||||
if (!refreshToken) throw new Error('no cache data')
|
||||
const token = await sso.refreshToken(refreshToken)
|
||||
@ -141,6 +159,7 @@ controller.authorization = () => {
|
||||
userInfo = await sso.getUserInfo(token.access_token)
|
||||
if (!userInfo) throw new Error('get user info fail')
|
||||
|
||||
cache.del(oldToken)
|
||||
ctx.set('x-new-token', ctx.token.origin)
|
||||
}
|
||||
|
||||
|
9806
package-lock.json
generated
9806
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user