68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
import { handleLogin, handleTokenRevocation } from '@server/lib/auth'
|
|
import * as RateLimit from 'express-rate-limit'
|
|
import { CONFIG } from '@server/initializers/config'
|
|
import * as express from 'express'
|
|
import { Hooks } from '@server/lib/plugins/hooks'
|
|
import { asyncMiddleware, authenticate } from '@server/middlewares'
|
|
import { ScopedToken } from '@shared/models/users/user-scoped-token'
|
|
import { v4 as uuidv4 } from 'uuid'
|
|
|
|
const tokensRouter = express.Router()
|
|
|
|
const loginRateLimiter = RateLimit({
|
|
windowMs: CONFIG.RATES_LIMIT.LOGIN.WINDOW_MS,
|
|
max: CONFIG.RATES_LIMIT.LOGIN.MAX
|
|
})
|
|
|
|
tokensRouter.post('/token',
|
|
loginRateLimiter,
|
|
handleLogin,
|
|
tokenSuccess
|
|
)
|
|
|
|
tokensRouter.post('/revoke-token',
|
|
authenticate,
|
|
asyncMiddleware(handleTokenRevocation)
|
|
)
|
|
|
|
tokensRouter.get('/scoped-tokens',
|
|
authenticate,
|
|
getScopedTokens
|
|
)
|
|
|
|
tokensRouter.post('/scoped-tokens',
|
|
authenticate,
|
|
asyncMiddleware(renewScopedTokens)
|
|
)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
export {
|
|
tokensRouter
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
function tokenSuccess (req: express.Request) {
|
|
const username = req.body.username
|
|
|
|
Hooks.runAction('action:api.user.oauth2-got-token', { username, ip: req.ip })
|
|
}
|
|
|
|
function getScopedTokens (req: express.Request, res: express.Response) {
|
|
const user = res.locals.oauth.token.user
|
|
|
|
return res.json({
|
|
feedToken: user.feedToken
|
|
} as ScopedToken)
|
|
}
|
|
|
|
async function renewScopedTokens (req: express.Request, res: express.Response) {
|
|
const user = res.locals.oauth.token.user
|
|
|
|
user.feedToken = uuidv4()
|
|
await user.save()
|
|
|
|
return res.json({
|
|
feedToken: user.feedToken
|
|
} as ScopedToken)
|
|
}
|