Skip to content

Commit 0052d6e

Browse files
committed
fix: fix issue #33
1 parent 43269e5 commit 0052d6e

File tree

7 files changed

+61
-29
lines changed

7 files changed

+61
-29
lines changed

playground/nuxt.config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
export default defineNuxtConfig({
33
app: {
4+
baseURL: '/openid/',
45
head: {
56
title: 'OIDC',
67
link: [

src/runtime/plugin.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineNuxtPlugin } from '#app'
22
import { Storage, StorageOptions } from './storage'
3-
import { isUnset, isSet } from './utils/utils'
3+
import { isUnset, isSet, getCleanUrl } from './utils/utils'
44
import { encrypt, decrypt } from './utils/encrypt'
55
import { useState, useFetch, useRuntimeConfig, useCookie } from '#imports'
66

@@ -95,23 +95,27 @@ export class Oidc {
9595

9696
login(redirect = '/') {
9797
if (import.meta.client) {
98+
const { app } = useRuntimeConfig()
9899
const params = new URLSearchParams({ redirect })
99-
const toStr = '/oidc/login?' + params.toString()
100-
window.location.replace(toStr)
100+
const link = '/oidc/login?' + params.toString()
101+
window.location.replace(getCleanUrl(app.baseURL + link))
102+
// navigateTo({ path: link })
101103
}
102104
}
103105

104106
logout(redirect = '/') {
105107
// TODO clear user info when accessToken expired.
106108
if (import.meta.client) {
109+
const { app } = useRuntimeConfig()
107110
const params = new URLSearchParams({ redirect })
108-
const toStr = '/oidc/logout?' + params.toString()
111+
const link = '/oidc/logout?' + params.toString()
109112

110113
this.$useState.value.user = {}
111114
this.$useState.value.isLoggedIn = false
112115

113116
this.$storage.removeUserInfo()
114-
window.location.replace(toStr)
117+
window.location.replace(getCleanUrl(app.baseURL + link))
118+
// navigateTo({ path: link })
115119
}
116120
}
117121
}

src/runtime/server/routes/oidc/callback.ts

+11-7
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ import * as http from 'http'
22
import { defineEventHandler, getCookie, setCookie, deleteCookie } from 'h3'
33
import { initClient } from '../../../utils/issueclient'
44
import { encrypt } from '../../../utils/encrypt'
5-
import { getRedirectUrl, getCallbackUrl, getDefaultBackUrl, getResponseMode, setCookieInfo, setCookieTokenAndRefreshToken } from '../../../utils/utils'
5+
import { getRedirectUrl, getCallbackUrl, getDefaultBackUrl, getResponseMode, setCookieInfo, setCookieTokenAndRefreshToken, getCleanUrl } from '../../../utils/utils'
66
import { useRuntimeConfig } from '#imports'
77

88
export default defineEventHandler(async (event) => {
9+
console.log('---------oidc nitro --------------')
910
const req = event.node.req
1011
const res = event.node.res
1112
console.log('[CALLBACK]: oidc/callback calling, method:' + req.method)
13+
const { app } = useRuntimeConfig()
14+
const baseUrl = app.baseURL
1215

1316
let request = req
1417
if (req.method === 'POST') {
@@ -25,11 +28,12 @@ export default defineEventHandler(async (event) => {
2528
const responseMode = getResponseMode(config)
2629
const sessionid = getCookie(event, config.secret)
2730
deleteCookie(event, config.secret)
31+
// Note: here not need add baseUrl, case in login already added baseUrl.
2832
const redirectUrl = getRedirectUrl(req.url)
2933
// console.log('---Callback. redirectUrl:' + redirectUrl)
3034
// console.log(' -- req.url:' + req.url + ' #method:' + req.method + ' #response_mode:' + responseMode)
3135

32-
const callbackUrl = getCallbackUrl(op.callbackUrl, redirectUrl, req.headers.host)
36+
const callbackUrl = getCallbackUrl('', redirectUrl, req.headers.host)
3337
const defCallBackUrl = getDefaultBackUrl(redirectUrl, req.headers.host)
3438

3539
const issueClient = await initClient(op, req, [defCallBackUrl, callbackUrl])
@@ -39,7 +43,7 @@ export default defineEventHandler(async (event) => {
3943
// Implicit ID Token Flow: access_token
4044
console.log('[CALLBACK]: has access_token in params, accessToken:' + params.access_token)
4145
await processUserInfo(params.access_token, null, event)
42-
res.writeHead(302, { Location: redirectUrl || '/' })
46+
res.writeHead(302, { Location: redirectUrl || baseUrl })
4347
res.end()
4448
} else if (params.code) {
4549
// Authorization Code Flow: code -> access_token
@@ -48,7 +52,7 @@ export default defineEventHandler(async (event) => {
4852
if (tokenSet.access_token) {
4953
await processUserInfo(tokenSet.access_token, tokenSet, event)
5054
}
51-
res.writeHead(302, { Location: redirectUrl || '/' })
55+
res.writeHead(302, { Location: redirectUrl || baseUrl })
5256
res.end()
5357
} else {
5458
// Error dealing.
@@ -57,15 +61,15 @@ export default defineEventHandler(async (event) => {
5761
// redirct to auth failed error page.
5862
console.error('[CALLBACK]: error callback')
5963
console.error(params.error + ', error_description:' + params.error_description)
60-
res.writeHead(302, { Location: '/oidc/error' })
64+
res.writeHead(302, { Location: getCleanUrl(baseUrl + '/oidc/error') })
6165
res.end()
6266
} else if (responseMode === 'fragment') {
6367
console.warn('[CALLBACK]: callback redirect')
64-
res.writeHead(302, { Location: '/oidc/cbt?redirect=' + redirectUrl })
68+
res.writeHead(302, { Location: getCleanUrl(baseUrl + '/oidc/cbt?redirect=' + redirectUrl) })
6569
res.end()
6670
} else {
6771
console.error('[CALLBACK]: error callback')
68-
res.writeHead(302, { Location: redirectUrl || '/' })
72+
res.writeHead(302, { Location: redirectUrl || baseUrl })
6973
res.end()
7074
}
7175
}

src/runtime/server/routes/oidc/login.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ import { getRedirectUrl, getCallbackUrl, getDefaultBackUrl, getResponseMode } fr
66
import { useRuntimeConfig } from '#imports'
77

88
export default defineEventHandler(async (event) => {
9+
console.log('---------oidc nitro --------------')
910
console.log('[Login]: oidc/login calling')
1011
const req = event.node.req
1112
const res = event.node.res
13+
const { app } = useRuntimeConfig()
14+
const baseUrl = app.baseURL
1215

1316
const { op, config } = useRuntimeConfig().openidConnect
14-
const redirectUrl = getRedirectUrl(req.url)
15-
const callbackUrl = getCallbackUrl(op.callbackUrl, redirectUrl, req.headers.host)
17+
const redirectUrl = getRedirectUrl(req.url, baseUrl)
18+
const callbackUrl = getCallbackUrl('', redirectUrl, req.headers.host)
1619
const defCallBackUrl = getDefaultBackUrl(redirectUrl, req.headers.host)
1720

1821
const issueClient = await initClient(op, req, [defCallBackUrl, callbackUrl])

src/runtime/server/routes/oidc/logout.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@ import { getRedirectUrl } from '../../../utils/utils';
33
import { useRuntimeConfig } from '#imports'
44

55
export default defineEventHandler((event) => {
6+
console.log('---------oidc nitro --------------')
67
const res = event.node.res
78
const req = event.node.req
9+
const { app } = useRuntimeConfig()
10+
const baseUrl = app.baseURL
811

912
console.log('[LOGOUT]: oidc/logout calling')
1013

1114
const { config } = useRuntimeConfig().openidConnect
12-
const redirectUrl = getRedirectUrl(req.url)
15+
const redirectUrl = getRedirectUrl(req.url, baseUrl)
1316
deleteCookie(event, config.secret)
1417
deleteCookie(event, config.cookiePrefix + 'access_token')
1518
deleteCookie(event, config.cookiePrefix + 'refresh_token')

src/runtime/server/routes/oidc/status.ts

+9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
import { defineEventHandler } from 'h3'
22

33
export default defineEventHandler((event) => {
4+
console.log('---------oidc nitro --------------')
5+
const config = useRuntimeConfig()
6+
const baseUrl = config.app.baseURL
7+
const query = getQuery(event)
48
const req = event.node.req
9+
10+
// console.log(req.headers)
11+
12+
console.log(req.url)
13+
console.log(baseUrl)
514
return {
615
api: 'nuxt-openid-connect api works'
716
}

src/runtime/utils/utils.ts

+22-14
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@ export const setCookieTokenAndRefreshToken = (event: any, config: any, tokenSet:
1717
}
1818

1919
// refresh token setting
20-
if (tokenSet && tokenSet.refresh_expires_in && tokenSet.refresh_token) {
21-
setCookie(event, config.cookiePrefix + 'refresh_token', tokenSet.refresh_token, {
22-
maxAge: tokenSet.refresh_expires_in
23-
})
24-
} else if (tokenSet && !config.hasCookieRefreshExpireDate && tokenSet.refresh_token) {
25-
const expireDate = new Date(Date.now() + config.cookieRefreshDefaultMaxAge * 1000);
26-
setCookie(event, config.cookiePrefix + 'refresh_token', tokenSet.refresh_token, {
27-
expires: expireDate
28-
})
29-
}
20+
if (tokenSet && tokenSet.refresh_expires_in && tokenSet.refresh_token) {
21+
setCookie(event, config.cookiePrefix + 'refresh_token', tokenSet.refresh_token, {
22+
maxAge: tokenSet.refresh_expires_in
23+
})
24+
} else if (tokenSet && !config.hasCookieRefreshExpireDate && tokenSet.refresh_token) {
25+
const expireDate = new Date(Date.now() + config.cookieRefreshDefaultMaxAge * 1000);
26+
setCookie(event, config.cookiePrefix + 'refresh_token', tokenSet.refresh_token, {
27+
expires: expireDate
28+
})
29+
}
3030
}
3131

3232
export const setCookieInfo = async (event: any, config: any, userinfo: any) => {
@@ -54,13 +54,15 @@ export const isUnset = (o: unknown): boolean =>
5454

5555
export const isSet = (o: unknown): boolean => !isUnset(o)
5656

57-
export const getRedirectUrl = (uri: string | null | undefined): string => {
57+
export const getRedirectUrl = (uri: string | null | undefined, baseURL: string | undefined = undefined): string => {
5858
if (!uri) {
59-
return '/'
59+
return baseURL || '/'
6060
}
6161
const idx = uri.indexOf('?')
6262
const searchParams = new URLSearchParams(idx >= 0 ? uri.substring(idx) : uri)
63-
return searchParams.get('redirect') || '/'
63+
const redirUrl = (baseURL ? baseURL + '/' : '') + searchParams.get('redirect')
64+
const cleanUrl = getCleanUrl(redirUrl)
65+
return cleanUrl || baseURL || '/'
6466
}
6567

6668
export function getCallbackUrl(callbackUrl: string, redirectUrl: string, host: string | undefined): string {
@@ -72,9 +74,15 @@ export function getCallbackUrl(callbackUrl: string, redirectUrl: string, host: s
7274
}
7375

7476
export function getDefaultBackUrl(redirectUrl: string, host: string | undefined): string {
75-
return 'http://' + host + '/oidc/cbt?redirect=' + redirectUrl
77+
const config = useRuntimeConfig()
78+
const baseUrl = config.app.baseURL
79+
console.log('------>baseUrl:' + baseUrl)
80+
return getCleanUrl('http://' + host + baseUrl + '/oidc/cbt?redirect=' + redirectUrl)
7681
}
7782

83+
export function getCleanUrl(url: string): string {
84+
return url.indexOf(':') >=0 ? url.replace(/([^:]\/)\/+/g, "$1") : url.replace(/\/\/+/g, '/')
85+
}
7886
/**
7987
* Response Mode
8088
* The Response Mode determines how the Authorization Server returns result parameters from the Authorization Endpoint.

0 commit comments

Comments
 (0)