34 lines
971 B
TypeScript
34 lines
971 B
TypeScript
import { generateState, getRedirectUri } from '~~/server/utils/oauth'
|
|
import { getOAuthStrategy } from '~~/server/utils/oauth-strategies'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const provider = getRouterParam(event, 'provider')
|
|
if (!provider) {
|
|
throw createError({ statusCode: 400, message: 'Missing provider' })
|
|
}
|
|
|
|
const strategy = getOAuthStrategy(provider)
|
|
|
|
// 获取 Origin
|
|
const headers = getRequestHeaders(event)
|
|
const protocol = headers['x-forwarded-proto'] || 'http'
|
|
const host = headers['host']
|
|
const origin = `${protocol}://${host}`
|
|
|
|
const redirectUri = getRedirectUri(provider)
|
|
|
|
const { state, csrf } = generateState(origin, provider)
|
|
|
|
setCookie(event, 'oauth_csrf', csrf, {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax',
|
|
maxAge: 60 * 10, // 10分钟
|
|
path: '/'
|
|
})
|
|
|
|
const url = strategy.getAuthorizeUrl(redirectUri, state)
|
|
|
|
return sendRedirect(event, url)
|
|
})
|