Skip to content

Commit d14fb57

Browse files
committed
OAuth1 to OAuth2
1 parent a86f145 commit d14fb57

14 files changed

+583
-401
lines changed

package-lock.json

Lines changed: 498 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"jest"
77
],
88
"scripts": {
9-
"dev": "vite & ts-node server/app.ts",
9+
"dev": "vite & tsx --tsconfig tsconfig.server.json server/app.ts",
1010
"build": "run-p build-only",
1111
"build-server": "tsc --project tsconfig.server.json",
1212
"preview": "vite preview",
@@ -41,7 +41,6 @@
4141
"langchain": "^0.3.19",
4242
"markdown-it": "^14.1.0",
4343
"node-fetch": "^2.6.7",
44-
"oauth": "^0.10.0",
4544
"obp-api-typescript": "^1.0.1",
4645
"obp-typescript": "^1.0.36",
4746
"pinia": "^2.0.37",
@@ -92,6 +91,7 @@
9291
"supertest": "^7.0.0",
9392
"ts-jest": "^29.2.5",
9493
"ts-node": "^10.9.1",
94+
"tsx": "^4.20.6",
9595
"typescript": "~5.2.2",
9696
"unplugin-auto-import": "^0.18.0",
9797
"unplugin-element-plus": "^0.8.0",

server/app.ts

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@ import express, { Application } from 'express'
3434
import { useExpressServer, useContainer } from 'routing-controllers'
3535
import { Container } from 'typedi'
3636
import path from 'path'
37+
import { fileURLToPath } from 'url'
3738
import { execSync } from 'child_process'
3839
import { OAuth2Service } from './services/OAuth2Service'
3940

41+
// Fix __dirname for ESM/tsx compatibility
42+
const __filename = fileURLToPath(import.meta.url)
43+
const __dirname = path.dirname(__filename)
44+
4045
const port = 8085
4146
const app: Application = express()
4247

@@ -109,41 +114,34 @@ useContainer(Container)
109114

110115
// Initialize OAuth2 Service
111116
console.log(`--- OAuth2/OIDC setup -------------------------------------------`)
112-
const useOAuth2 = process.env.VITE_USE_OAUTH2 === 'true'
113-
console.log(`OAuth2/OIDC enabled: ${useOAuth2}`)
114-
115-
if (useOAuth2) {
116-
const wellKnownUrl = process.env.VITE_OBP_OAUTH2_WELL_KNOWN_URL
117+
const wellKnownUrl = process.env.VITE_OBP_OAUTH2_WELL_KNOWN_URL
117118

118-
if (!wellKnownUrl) {
119-
console.warn('VITE_OBP_OAUTH2_WELL_KNOWN_URL not set. OAuth2 will not function.')
120-
} else {
121-
console.log(`OIDC Well-Known URL: ${wellKnownUrl}`)
122-
123-
// Get OAuth2Service from container
124-
const oauth2Service = Container.get(OAuth2Service)
125-
126-
// Initialize OAuth2 service from OIDC discovery document
127-
oauth2Service
128-
.initializeFromWellKnown(wellKnownUrl)
129-
.then(() => {
130-
console.log('OAuth2Service: Initialization successful')
131-
console.log(' Client ID:', process.env.VITE_OBP_OAUTH2_CLIENT_ID || 'NOT SET')
132-
console.log(' Redirect URI:', process.env.VITE_OBP_OAUTH2_REDIRECT_URL || 'NOT SET')
133-
console.log('OAuth2/OIDC ready for authentication')
134-
})
135-
.catch((error) => {
136-
console.error('OAuth2Service: Initialization failed:', error.message)
137-
console.error('OAuth2/OIDC authentication will not be available')
138-
console.error('Please check:')
139-
console.error(' 1. OBP-OIDC server is running')
140-
console.error(' 2. VITE_OBP_OAUTH2_WELL_KNOWN_URL is correct')
141-
console.error(' 3. Network connectivity to OIDC provider')
142-
})
143-
}
119+
if (!wellKnownUrl) {
120+
console.error('VITE_OBP_OAUTH2_WELL_KNOWN_URL not set. OAuth2 will not function.')
121+
console.error('Please set this environment variable to continue.')
144122
} else {
145-
console.log('OAuth2/OIDC is disabled. Using OAuth 1.0a authentication.')
146-
console.log('To enable OAuth2, set VITE_USE_OAUTH2=true in environment')
123+
console.log(`OIDC Well-Known URL: ${wellKnownUrl}`)
124+
125+
// Get OAuth2Service from container
126+
const oauth2Service = Container.get(OAuth2Service)
127+
128+
// Initialize OAuth2 service from OIDC discovery document
129+
oauth2Service
130+
.initializeFromWellKnown(wellKnownUrl)
131+
.then(() => {
132+
console.log('OAuth2Service: Initialization successful')
133+
console.log(' Client ID:', process.env.VITE_OBP_OAUTH2_CLIENT_ID || 'NOT SET')
134+
console.log(' Redirect URI:', process.env.VITE_OBP_OAUTH2_REDIRECT_URL || 'NOT SET')
135+
console.log('OAuth2/OIDC ready for authentication')
136+
})
137+
.catch((error) => {
138+
console.error('OAuth2Service: Initialization failed:', error.message)
139+
console.error('OAuth2/OIDC authentication will not be available')
140+
console.error('Please check:')
141+
console.error(' 1. OBP-OIDC server is running')
142+
console.error(' 2. VITE_OBP_OAUTH2_WELL_KNOWN_URL is correct')
143+
console.error(' 3. Network connectivity to OIDC provider')
144+
})
147145
}
148146
console.log(`-----------------------------------------------------------------`)
149147

server/controllers/CallbackController.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

server/controllers/ConnectController.ts

Lines changed: 0 additions & 41 deletions
This file was deleted.

server/controllers/StatusController.ts

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import { Controller, Session, Req, Res, Get } from 'routing-controllers'
2929
import { Request, Response } from 'express'
3030
import OBPClientService from '../services/OBPClientService'
31-
import OauthInjectedService from '../services/OauthInjectedService'
31+
3232
import { Service } from 'typedi'
3333
import { OAuthConfig } from 'obp-typescript'
3434
import { commitId } from '../app'
@@ -43,10 +43,7 @@ export class StatusController {
4343
'stored_procedure_vDec2019',
4444
'rabbitmq_vOct2024'
4545
]
46-
constructor(
47-
private obpClientService: OBPClientService,
48-
private oauthInjectedService: OauthInjectedService
49-
) {}
46+
constructor(private obpClientService: OBPClientService) {}
5047
@Get('/')
5148
async index(
5249
@Session() session: any,
@@ -55,7 +52,10 @@ export class StatusController {
5552
): Response {
5653
const oauthConfig = session['clientConfig']
5754
const version = this.obpClientService.getOBPVersion()
58-
const currentUser = await this.obpClientService.get(`/obp/${version}/users/current`, oauthConfig)
55+
const currentUser = await this.obpClientService.get(
56+
`/obp/${version}/users/current`,
57+
oauthConfig
58+
)
5959
const apiVersions = await this.checkApiVersions(oauthConfig, version)
6060
const messageDocs = await this.checkMessagDocs(oauthConfig, version)
6161
const resourceDocs = await this.checkResourceDocs(oauthConfig, version)
@@ -85,10 +85,7 @@ export class StatusController {
8585
async checkResourceDocs(oauthConfig: OAuthConfig, version: string): Promise<boolean> {
8686
try {
8787
const path = `/obp/${version}/resource-docs/${version}/obp`
88-
const resourceDocs = await this.obpClientService.get(
89-
path,
90-
oauthConfig
91-
)
88+
const resourceDocs = await this.obpClientService.get(path, oauthConfig)
9289
return !this.isCodeError(resourceDocs, path)
9390
} catch (error) {
9491
return false
@@ -99,13 +96,7 @@ export class StatusController {
9996
const messageDocsCodeResult = await Promise.all(
10097
this.connectors.map(async (connector) => {
10198
const path = `/obp/${version}/message-docs/${connector}`
102-
return !this.isCodeError(
103-
await this.obpClientService.get(
104-
path,
105-
oauthConfig
106-
),
107-
path
108-
)
99+
return !this.isCodeError(await this.obpClientService.get(path, oauthConfig), path)
109100
})
110101
)
111102
return messageDocsCodeResult.every((isCodeError: boolean) => isCodeError)

server/controllers/UserController.ts

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,16 @@
2828
import { Controller, Session, Req, Res, Get } from 'routing-controllers'
2929
import { Request, Response } from 'express'
3030
import OBPClientService from '../services/OBPClientService'
31-
import OauthInjectedService from '../services/OauthInjectedService'
3231
import { Service } from 'typedi'
33-
import superagent from 'superagent'
3432
import { OAuth2Service } from '../services/OAuth2Service'
3533

3634
@Service()
3735
@Controller('/user')
3836
export class UserController {
3937
private obpExplorerHome = process.env.VITE_OBP_API_EXPLORER_HOST
40-
private useOAuth2 = process.env.VITE_USE_OAUTH2 === 'true'
4138

4239
constructor(
4340
private obpClientService: OBPClientService,
44-
private oauthInjectedService: OauthInjectedService,
4541
private oauth2Service: OAuth2Service
4642
) {}
4743
@Get('/logoff')
@@ -52,11 +48,6 @@ export class UserController {
5248
): Response {
5349
console.log('UserController: Logging out user')
5450

55-
// Clear OAuth 1.0a session data
56-
this.oauthInjectedService.requestTokenKey = undefined
57-
this.oauthInjectedService.requestTokenSecret = undefined
58-
session['clientConfig'] = undefined
59-
6051
// Clear OAuth2 session data
6152
delete session['oauth2_access_token']
6253
delete session['oauth2_refresh_token']
@@ -95,10 +86,9 @@ export class UserController {
9586
@Res() response: Response
9687
): Response {
9788
console.log('UserController: Getting current user')
98-
console.log(' OAuth2 enabled:', this.useOAuth2)
9989

100-
// Check OAuth2 session first (if OAuth2 is enabled)
101-
if (this.useOAuth2 && session['oauth2_user']) {
90+
// Check OAuth2 session
91+
if (session['oauth2_user']) {
10292
console.log('UserController: Returning OAuth2 user info')
10393
const oauth2User = session['oauth2_user']
10494

@@ -146,24 +136,8 @@ export class UserController {
146136
})
147137
}
148138

149-
// Fall back to OAuth 1.0a
150-
console.log('UserController: Checking OAuth 1.0a session')
151-
const oauthConfig = session['clientConfig']
152-
153-
if (!oauthConfig) {
154-
console.log('UserController: No authentication session found')
155-
return response.json({})
156-
}
157-
158-
console.log('UserController: Returning OAuth 1.0a user info')
159-
const version = this.obpClientService.getOBPVersion()
160-
161-
try {
162-
const userData = await this.obpClientService.get(`/obp/${version}/users/current`, oauthConfig)
163-
return response.json(userData)
164-
} catch (error) {
165-
console.error('UserController: Failed to get user from OBP API:', error)
166-
return response.json({})
167-
}
139+
// No authentication session found
140+
console.log('UserController: No authentication session found')
141+
return response.json({})
168142
}
169143
}

server/middlewares/OAuth2AuthorizationMiddleware.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
import { ExpressMiddlewareInterface } from 'routing-controllers'
2929
import { Request, Response } from 'express'
30-
import { Service } from 'typedi'
30+
import { Service, Container } from 'typedi'
3131
import { OAuth2Service } from '../services/OAuth2Service'
3232
import { PKCEUtils } from '../utils/pkce'
3333

@@ -58,7 +58,12 @@ import { PKCEUtils } from '../utils/pkce'
5858
*/
5959
@Service()
6060
export default class OAuth2AuthorizationMiddleware implements ExpressMiddlewareInterface {
61-
constructor(private oauth2Service: OAuth2Service) {}
61+
private oauth2Service: OAuth2Service
62+
63+
constructor() {
64+
// Explicitly get OAuth2Service from the container to avoid injection issues
65+
this.oauth2Service = Container.get(OAuth2Service)
66+
}
6267

6368
/**
6469
* Handle the authorization request
@@ -69,7 +74,14 @@ export default class OAuth2AuthorizationMiddleware implements ExpressMiddlewareI
6974
async use(request: Request, response: Response): Promise<void> {
7075
console.log('OAuth2AuthorizationMiddleware: Starting OAuth2 authorization flow')
7176

72-
// Check if OAuth2 service is initialized
77+
// Check if OAuth2 service exists and is initialized
78+
if (!this.oauth2Service) {
79+
console.error('OAuth2AuthorizationMiddleware: OAuth2 service is null/undefined')
80+
return response
81+
.status(500)
82+
.send('OAuth2 service not available. Please check server configuration.')
83+
}
84+
7385
if (!this.oauth2Service.isInitialized()) {
7486
console.error('OAuth2AuthorizationMiddleware: OAuth2 service not initialized')
7587
return response
@@ -140,9 +152,7 @@ export default class OAuth2AuthorizationMiddleware implements ExpressMiddlewareI
140152
delete session['oauth2_flow_timestamp']
141153
delete session['oauth2_redirect_page']
142154

143-
return response
144-
.status(500)
145-
.send(`Failed to initiate OAuth2 flow: ${error.message}`)
155+
return response.status(500).send(`Failed to initiate OAuth2 flow: ${error.message}`)
146156
}
147157
}
148158
}

0 commit comments

Comments
 (0)