|
1 | 1 | import { randomUUID } from "node:crypto"; |
2 | | -import { ConflictException, Injectable } from "@nestjs/common"; |
| 2 | +import { |
| 3 | + BadRequestException, |
| 4 | + ConflictException, |
| 5 | + Injectable, |
| 6 | +} from "@nestjs/common"; |
3 | 7 | import { ConfigService } from "@nestjs/config"; |
4 | 8 | import { |
5 | 9 | type AuthorizationCodeGrantIdentifier, |
@@ -107,11 +111,19 @@ export class AuthorizeService { |
107 | 111 | } |
108 | 112 | } |
109 | 113 |
|
| 114 | + /** |
| 115 | + * Validate the token request. |
| 116 | + * This endpoint is used to exchange the authorization code for an access token. |
| 117 | + * @param body |
| 118 | + * @param req |
| 119 | + * @returns |
| 120 | + */ |
110 | 121 | async validateTokenRequest( |
111 | 122 | body: any, |
112 | 123 | req: Request, |
113 | 124 | tenantId: string, |
114 | 125 | ): Promise<any> { |
| 126 | + //TODO: check if all the error cases are covered: https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-token-error-response |
115 | 127 | const url = `${this.configService.getOrThrow<string>("PUBLIC_URL")}${req.url}`; |
116 | 128 | const parsedAccessTokenRequest = this.getAuthorizationServer( |
117 | 129 | tenantId, |
@@ -143,29 +155,34 @@ export class AuthorizeService { |
143 | 155 | parsedAccessTokenRequest.grant.grantType === |
144 | 156 | preAuthorizedCodeGrantIdentifier |
145 | 157 | ) { |
146 | | - const { dpop } = await this.getAuthorizationServer( |
147 | | - tenantId, |
148 | | - ).verifyPreAuthorizedCodeAccessTokenRequest({ |
149 | | - grant: parsedAccessTokenRequest.grant as ParsedAccessTokenPreAuthorizedCodeRequestGrant, |
150 | | - accessTokenRequest: parsedAccessTokenRequest.accessTokenRequest, |
151 | | - request: { |
152 | | - method: req.method as HttpMethod, |
153 | | - url, |
154 | | - headers: getHeadersFromRequest(req), |
155 | | - }, |
156 | | - dpop: { |
157 | | - required: issuanceConfig.dPopRequired, |
158 | | - allowedSigningAlgs: |
159 | | - authorizationServerMetadata.dpop_signing_alg_values_supported, |
160 | | - jwt: parsedAccessTokenRequest.dpop?.jwt, |
161 | | - }, |
| 158 | + const { dpop } = await this.getAuthorizationServer(tenantId) |
| 159 | + .verifyPreAuthorizedCodeAccessTokenRequest({ |
| 160 | + grant: parsedAccessTokenRequest.grant as ParsedAccessTokenPreAuthorizedCodeRequestGrant, |
| 161 | + accessTokenRequest: |
| 162 | + parsedAccessTokenRequest.accessTokenRequest, |
| 163 | + request: { |
| 164 | + method: req.method as HttpMethod, |
| 165 | + url, |
| 166 | + headers: getHeadersFromRequest(req), |
| 167 | + }, |
| 168 | + dpop: { |
| 169 | + required: issuanceConfig.dPopRequired, |
| 170 | + allowedSigningAlgs: |
| 171 | + authorizationServerMetadata.dpop_signing_alg_values_supported, |
| 172 | + jwt: parsedAccessTokenRequest.dpop?.jwt, |
| 173 | + }, |
162 | 174 |
|
163 | | - authorizationServerMetadata, |
| 175 | + authorizationServerMetadata, |
164 | 176 |
|
165 | | - expectedPreAuthorizedCode: |
166 | | - parsedAccessTokenRequest.grant.preAuthorizedCode, |
167 | | - expectedTxCode: parsedAccessTokenRequest.grant.txCode, |
168 | | - }); |
| 177 | + expectedPreAuthorizedCode: session.authorization_code!, |
| 178 | + expectedTxCode: session.credentialPayload?.tx_code, |
| 179 | + }) |
| 180 | + .catch((err) => { |
| 181 | + throw new BadRequestException(err.error, { |
| 182 | + cause: err, |
| 183 | + description: err.error_description, |
| 184 | + }); |
| 185 | + }); |
169 | 186 | dpopValue = dpop; |
170 | 187 | } |
171 | 188 |
|
|
0 commit comments