1
+ import { buildOrganizationUrn } from '@logto/core-kit' ;
1
2
import { ApplicationType , GrantType , type Resource } from '@logto/schemas' ;
2
3
import { formUrlEncodedHeaders } from '@logto/shared' ;
3
4
@@ -10,6 +11,7 @@ import {
10
11
} from '#src/api/application.js' ;
11
12
import { createResource , deleteResource } from '#src/api/resource.js' ;
12
13
import { createUserByAdmin } from '#src/helpers/index.js' ;
14
+ import { OrganizationApiTest } from '#src/helpers/organization.js' ;
13
15
import { generatePassword , generateUsername , getAccessTokenPayload } from '#src/utils.js' ;
14
16
15
17
const tokenType = 'urn:logto:token-type:personal_access_token' ;
@@ -201,4 +203,29 @@ describe('Token Exchange (Personal Access Token)', () => {
201
203
} )
202
204
) . rejects . toThrow ( ) ;
203
205
} ) ;
206
+
207
+ it ( 'should be able to exchange an organization token' , async ( ) => {
208
+ const organizationApi = new OrganizationApiTest ( ) ;
209
+ const organization = await organizationApi . create ( { name : 'foo' } ) ;
210
+ await organizationApi . addUsers ( organization . id , [ testUserId ] ) ;
211
+
212
+ const body = await oidcApi
213
+ . post ( 'token' , {
214
+ headers : {
215
+ ...formUrlEncodedHeaders ,
216
+ Authorization : authorizationHeader ,
217
+ } ,
218
+ body : new URLSearchParams ( {
219
+ grant_type : GrantType . TokenExchange ,
220
+ subject_token : testToken ,
221
+ subject_token_type : tokenType ,
222
+ organization_id : organization . id ,
223
+ } ) ,
224
+ } )
225
+ . json < { access_token : string } > ( ) ;
226
+
227
+ const payload = getAccessTokenPayload ( body . access_token ) ;
228
+ expect ( payload ) . toHaveProperty ( 'aud' , buildOrganizationUrn ( organization . id ) ) ;
229
+ expect ( payload ) . toHaveProperty ( 'sub' , testUserId ) ;
230
+ } ) ;
204
231
} ) ;
0 commit comments