49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import BaseController, { ROLE_ANON } from 'common/base.controller'
|
|
import { ZError } from 'common/ZError'
|
|
import { role, router } from 'decorators/router'
|
|
import logger from 'logger/logger'
|
|
import { AuthRecord } from 'modules/AuthRecord'
|
|
import { DiscordSvr, exchangeDiscrodCodeForToken, userInfo } from 'services/discord.svr'
|
|
import { parseOauthState } from 'utils/net.util'
|
|
|
|
class DiscordController extends BaseController {
|
|
@role(ROLE_ANON)
|
|
@router('get /discord/redirect_uri')
|
|
async discordCallback(req, res) {
|
|
let { code, state } = req.params
|
|
if (code && state) {
|
|
const stateArr = parseOauthState(state)
|
|
const address = stateArr[0].toLowerCase()
|
|
const record = await AuthRecord.insertOrUpdate(
|
|
{ address, platform: 7 },
|
|
{ address, platform: 7, $inc: { version: 1 } },
|
|
)
|
|
let tokenResponse = await exchangeDiscrodCodeForToken(code)
|
|
record.accessToken = tokenResponse.access_token
|
|
record.refreshToken = tokenResponse.refresh_token
|
|
record.scope = tokenResponse.scope
|
|
record.tokenType = tokenResponse.token_type
|
|
record.expiresIn = (Date.now() / 1000 + tokenResponse.expires_in) | 0
|
|
await record.save()
|
|
if (tokenResponse && tokenResponse.access_token) {
|
|
let uinfo = await userInfo(tokenResponse.access_token)
|
|
record.nickname = uinfo.username
|
|
record.username = uinfo.username
|
|
record.discriminator = uinfo.discriminator
|
|
record.openId = uinfo.id
|
|
await record.save()
|
|
}
|
|
if (stateArr.length > 2) {
|
|
return res.redirect(stateArr[2])
|
|
}
|
|
}
|
|
if (state) {
|
|
const stateArr = parseOauthState(state)
|
|
if (stateArr.length > 2) {
|
|
return res.redirect(stateArr[2])
|
|
}
|
|
}
|
|
return res.view('/templates/discord_redirect.ejs')
|
|
}
|
|
}
|