mirror of
https://github.com/logto-io/logto.git
synced 2024-12-16 20:26:19 -05:00
chore: fix code
This commit is contained in:
parent
2ec1f56c11
commit
225bdf4ba9
4 changed files with 1 additions and 266 deletions
|
@ -61,6 +61,7 @@ export const createSamlApplicationsLibrary = (queries: Queries) => {
|
|||
);
|
||||
|
||||
const [updatedApplication, upToDateSamlConfig] = await Promise.all([
|
||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
||||
name || description || customData
|
||||
? updateApplicationById(
|
||||
id,
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
import { generateStandardId } from '@logto/shared';
|
||||
|
||||
import type Queries from '#src/tenants/Queries.js';
|
||||
|
||||
import { generateKeyPairAndCertificate } from './utils.js';
|
||||
|
||||
export const createSamlApplicationSecretsLibrary = (queries: Queries) => {
|
||||
const {
|
||||
samlApplicationSecrets: { insertSamlApplicationSecret },
|
||||
} = queries;
|
||||
|
||||
const createSamlApplicationSecret = async (
|
||||
applicationId: string,
|
||||
// Set certificate life span to 1 year by default.
|
||||
lifeSpanInDays = 365
|
||||
) => {
|
||||
const { privateKey, certificate, notAfter } = await generateKeyPairAndCertificate(
|
||||
lifeSpanInDays
|
||||
);
|
||||
|
||||
return insertSamlApplicationSecret({
|
||||
id: generateStandardId(),
|
||||
applicationId,
|
||||
privateKey,
|
||||
certificate,
|
||||
expiresAt: Math.floor(notAfter.getTime() / 1000),
|
||||
active: false,
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
createSamlApplicationSecret,
|
||||
};
|
||||
};
|
|
@ -1,190 +0,0 @@
|
|||
{
|
||||
"tags": [
|
||||
{
|
||||
"name": "SAML applications",
|
||||
"description": "SAML applications enable Single Sign-On (SSO) integration between Logto (acting as Identity Provider/IdP) and third-party Service Providers (SP) using the SAML 2.0 protocol. These endpoints allow you to manage SAML application configurations."
|
||||
},
|
||||
{
|
||||
"name": "Dev feature"
|
||||
}
|
||||
],
|
||||
"paths": {
|
||||
"/api/saml-applications": {
|
||||
"post": {
|
||||
"summary": "Create SAML application",
|
||||
"description": "Create a new SAML application with the given configuration. This will create both the application entity and its SAML-specific configurations.",
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "The name of the SAML application."
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "The description of the SAML application."
|
||||
},
|
||||
"customData": {
|
||||
"type": "object",
|
||||
"description": "Custom data for the application."
|
||||
},
|
||||
"config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"attributeMapping": {
|
||||
"type": "object",
|
||||
"description": "Mapping of SAML attributes to Logto user properties."
|
||||
},
|
||||
"entityId": {
|
||||
"type": "string",
|
||||
"description": "Service provider's entityId."
|
||||
},
|
||||
"acsUrl": {
|
||||
"type": "object",
|
||||
"description": "Service provider assertion consumer service URL configuration."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"201": {
|
||||
"description": "The SAML application was created successfully."
|
||||
},
|
||||
"400": {
|
||||
"description": "Invalid request body or SAML configuration."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"/api/saml-applications/{id}": {
|
||||
"get": {
|
||||
"summary": "Get SAML application",
|
||||
"description": "Get a SAML application by ID. This will return both the application entity and its SAML-specific configurations.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "The ID of the SAML application to retrieve."
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "The SAML application was retrieved successfully."
|
||||
},
|
||||
"400": {
|
||||
"description": "Invalid application ID, the application is not a SAML application."
|
||||
},
|
||||
"404": {
|
||||
"description": "The SAML application was not found."
|
||||
}
|
||||
}
|
||||
},
|
||||
"patch": {
|
||||
"summary": "Update SAML application",
|
||||
"description": "Update a SAML application by ID. This will update both the application entity and its SAML-specific configurations.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "The ID of the SAML application to update."
|
||||
}
|
||||
],
|
||||
"requestBody": {
|
||||
"required": true,
|
||||
"content": {
|
||||
"application/json": {
|
||||
"schema": {
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "The name of the SAML application."
|
||||
},
|
||||
"description": {
|
||||
"type": "string",
|
||||
"description": "The description of the SAML application."
|
||||
},
|
||||
"customData": {
|
||||
"type": "object",
|
||||
"description": "Custom data for the application."
|
||||
},
|
||||
"config": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"attributeMapping": {
|
||||
"type": "object",
|
||||
"description": "Mapping of SAML attributes to Logto user properties."
|
||||
},
|
||||
"entityId": {
|
||||
"type": "string",
|
||||
"description": "Service provider's entityId."
|
||||
},
|
||||
"acsUrl": {
|
||||
"type": "object",
|
||||
"description": "Service provider assertion consumer service URL configuration."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"responses": {
|
||||
"200": {
|
||||
"description": "The SAML application was updated successfully."
|
||||
},
|
||||
"400": {
|
||||
"description": "Invalid application ID or request body."
|
||||
},
|
||||
"404": {
|
||||
"description": "The SAML application was not found."
|
||||
},
|
||||
"422": {
|
||||
"description": "Invalid SAML configuration."
|
||||
}
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"summary": "Delete SAML application",
|
||||
"description": "Delete a SAML application by ID. This will remove both the application entity and its SAML-specific configurations.",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "id",
|
||||
"in": "path",
|
||||
"required": true,
|
||||
"schema": {
|
||||
"type": "string"
|
||||
},
|
||||
"description": "The ID of the SAML application to delete."
|
||||
}
|
||||
],
|
||||
"responses": {
|
||||
"204": {
|
||||
"description": "The SAML application was deleted successfully."
|
||||
},
|
||||
"400": {
|
||||
"description": "Invalid application ID, the application is not a SAML application."
|
||||
},
|
||||
"404": {
|
||||
"description": "The SAML application was not found."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,42 +0,0 @@
|
|||
import {
|
||||
type SamlApplicationResponse,
|
||||
type Application,
|
||||
type SamlApplicationConfig,
|
||||
type SamlAcsUrl,
|
||||
BindingType,
|
||||
} from '@logto/schemas';
|
||||
|
||||
import RequestError from '#src/errors/RequestError/index.js';
|
||||
import assertThat from '#src/utils/assert-that.js';
|
||||
|
||||
/**
|
||||
* According to the design, a SAML app will be associated with multiple records from various tables.
|
||||
* Therefore, when complete SAML app data is required, it is necessary to retrieve multiple related records and assemble them into a comprehensive SAML app dataset. This dataset includes:
|
||||
* - A record from the `applications` table with a `type` of `SAML`
|
||||
* - A record from the `saml_application_configs` table
|
||||
*/
|
||||
export const ensembleSamlApplication = ({
|
||||
application,
|
||||
samlConfig,
|
||||
}: {
|
||||
application: Application;
|
||||
samlConfig: Pick<SamlApplicationConfig, 'attributeMapping' | 'entityId' | 'acsUrl'>;
|
||||
}): SamlApplicationResponse => {
|
||||
return {
|
||||
...application,
|
||||
...samlConfig,
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* Only HTTP-POST binding is supported for receiving SAML assertions at the moment.
|
||||
*/
|
||||
export const validateAcsUrl = (acsUrl: SamlAcsUrl) => {
|
||||
assertThat(
|
||||
acsUrl.binding === BindingType.POST,
|
||||
new RequestError({
|
||||
code: 'application.saml.acs_url_binding_not_supported',
|
||||
status: 422,
|
||||
})
|
||||
);
|
||||
};
|
Loading…
Reference in a new issue