From 675ee6fd8112b847ed2c4c1a70098ea74c656817 Mon Sep 17 00:00:00 2001
From: clauspeterhuebner
Date: Mon, 14 Apr 2025 19:03:47 +0200
Subject: [PATCH] next try for verifyJWT with RS256 and private/public key
usage
---
backend/src/auth/jwt/JWT.ts | 23 ++++++++++++-------
.../resolver/TransactionLinkResolver.ts | 16 +++++++++----
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/backend/src/auth/jwt/JWT.ts b/backend/src/auth/jwt/JWT.ts
index 5bf0166a4..f8acfe4a3 100644
--- a/backend/src/auth/jwt/JWT.ts
+++ b/backend/src/auth/jwt/JWT.ts
@@ -5,21 +5,26 @@ import { backendLogger as logger } from '@/server/logger'
import { JwtPayloadType } from './payloadtypes/JwtPayloadType'
-export const decode = async (token: string, signkey: Buffer): Promise => {
+export const verify = async (token: string, signkey: Buffer): Promise => {
if (!token) throw new LogError('401 Unauthorized')
- logger.debug('JWT.decode... token, signkey=', token, signkey)
+ logger.debug(
+ 'JWT.verify... token, signkey, signkey.toString()',
+ token,
+ signkey,
+ signkey.toString(),
+ )
try {
const secret = new TextEncoder().encode(signkey.toString())
- logger.debug('JWT.decode... secret=', secret)
+ logger.debug('JWT.verify... secret=', secret)
const { payload } = await jwtVerify(token, secret, {
issuer: 'urn:gradido:issuer',
audience: 'urn:gradido:audience',
})
- logger.debug('JWT.decode after jwtVerify... payload=', payload)
+ logger.debug('JWT.verify after jwtVerify... payload=', payload)
return payload as unknown as JwtPayloadType
} catch (err) {
- logger.error('JWT.decode after jwtVerify... error=', err)
+ logger.error('JWT.verify after jwtVerify... error=', err)
return null
}
}
@@ -27,7 +32,9 @@ export const decode = async (token: string, signkey: Buffer): Promise => {
const secret = new TextEncoder().encode(signkey.toString())
const token = await new SignJWT({ payload, 'urn:gradido:claim': true })
- .setProtectedHeader({ alg: 'HS256' })
+ .setProtectedHeader({
+ alg: 'RS256',
+ })
.setIssuedAt()
.setIssuer('urn:gradido:issuer')
.setAudience('urn:gradido:audience')
@@ -36,7 +43,7 @@ export const encode = async (payload: JwtPayloadType, signkey: Buffer): Promise<
return token
}
-export const decodeJwtType = async (token: string, signkey: Buffer): Promise => {
- const payload = await decode(token, signkey)
+export const verifyJwtType = async (token: string, signkey: Buffer): Promise => {
+ const payload = await verify(token, signkey)
return payload ? payload.tokentype : 'unknown token type'
}
diff --git a/backend/src/graphql/resolver/TransactionLinkResolver.ts b/backend/src/graphql/resolver/TransactionLinkResolver.ts
index c5c040eea..429c7ba9b 100644
--- a/backend/src/graphql/resolver/TransactionLinkResolver.ts
+++ b/backend/src/graphql/resolver/TransactionLinkResolver.ts
@@ -23,7 +23,7 @@ import { TransactionLink, TransactionLinkResult } from '@model/TransactionLink'
import { User } from '@model/User'
import { QueryLinkResult } from '@union/QueryLinkResult'
-import { decode, encode } from '@/auth/jwt/JWT'
+import { verify, encode } from '@/auth/jwt/JWT'
import { DisbursementJwtPayloadType } from '@/auth/jwt/payloadtypes/DisbursementJwtPayloadType'
import { RIGHTS } from '@/auth/RIGHTS'
import {
@@ -177,21 +177,27 @@ export class TransactionLinkResolver {
return new TransactionLink(dbTransactionLink, new User(user), redeemedBy, communities)
} else {
// disbursement jwt-token
- logger.debug(
- 'TransactionLinkResolver.queryTransactionLink... disbursement jwt-token found=',
- )
+ logger.debug('TransactionLinkResolver.queryTransactionLink... disbursement jwt-token found')
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment
const homeCom = await getHomeCommunity()
- const jwtPayload = await decode(code, homeCom.publicKey)
+ const jwtPayload = await verify(code, homeCom.publicKey)
logger.debug('TransactionLinkResolver.queryTransactionLink... jwtPayload=', jwtPayload)
if (jwtPayload !== null && jwtPayload instanceof DisbursementJwtPayloadType) {
const disburseJwtPayload: DisbursementJwtPayloadType = jwtPayload
+ logger.debug(
+ 'TransactionLinkResolver.queryTransactionLink... disburseJwtPayload=',
+ jwtPayload,
+ )
transactionLink.communityName = homeCom.name !== null ? homeCom.name : 'unknown'
// transactionLink.user = new User()
transactionLink.user.alias = disburseJwtPayload.sendername
transactionLink.amount = new Decimal(disburseJwtPayload.amount)
transactionLink.memo = disburseJwtPayload.memo
transactionLink.code = disburseJwtPayload.redeemcode
+ logger.debug(
+ 'TransactionLinkResolver.queryTransactionLink... transactionLink=',
+ transactionLink,
+ )
return transactionLink
} else {
throw new LogError('Redeem with wrong type of JWT-Token! jwtType=', jwtPayload)