|
|
@@ -48,8 +48,8 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
],
|
|
|
keycloakSyncSettings: [
|
|
|
body('keycloakHost').exists({ checkFalsy: true }).isString(),
|
|
|
- body('keycloakRealm').exists({ checkFalsy: true }).isString(),
|
|
|
- body('keycloakGroupSyncClientName').exists({ checkFalsy: true }).isString(),
|
|
|
+ body('keycloakGroupRealm').exists({ checkFalsy: true }).isString(),
|
|
|
+ body('keycloakGroupSyncClientRealm').exists({ checkFalsy: true }).isString(),
|
|
|
body('keycloakGroupSyncClientID').exists({ checkFalsy: true }).isString(),
|
|
|
body('keycloakGroupSyncClientSecret').exists({ checkFalsy: true }).isString(),
|
|
|
body('autoGenerateUserOnKeycloakGroupSync').exists().isBoolean(),
|
|
|
@@ -226,8 +226,8 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
router.get('/keycloak/sync-settings', loginRequiredStrictly, adminRequired, (req: AuthorizedRequest, res: ApiV3Response) => {
|
|
|
const settings = {
|
|
|
keycloakHost: configManager?.getConfig('crowi', 'external-user-group:keycloak:host'),
|
|
|
- keycloakRealm: configManager?.getConfig('crowi', 'external-user-group:keycloak:realm'),
|
|
|
- keycloakGroupSyncClientName: configManager?.getConfig('crowi', 'external-user-group:keycloak:groupSyncClientName'),
|
|
|
+ keycloakGroupRealm: configManager?.getConfig('crowi', 'external-user-group:keycloak:groupRealm'),
|
|
|
+ keycloakGroupSyncClientRealm: configManager?.getConfig('crowi', 'external-user-group:keycloak:groupSyncClientRealm'),
|
|
|
keycloakGroupSyncClientID: configManager?.getConfig('crowi', 'external-user-group:keycloak:groupSyncClientID'),
|
|
|
keycloakGroupSyncClientSecret: configManager?.getConfig('crowi', 'external-user-group:keycloak:groupSyncClientSecret'),
|
|
|
autoGenerateUserOnKeycloakGroupSync: configManager?.getConfig('crowi', 'external-user-group:keycloak:autoGenerateUserOnGroupSync'),
|
|
|
@@ -279,8 +279,8 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
|
|
|
const params = {
|
|
|
'external-user-group:keycloak:host': req.body.keycloakHost,
|
|
|
- 'external-user-group:keycloak:realm': req.body.keycloakRealm,
|
|
|
- 'external-user-group:keycloak:groupSyncClientName': req.body.keycloakGroupSyncClientName,
|
|
|
+ 'external-user-group:keycloak:groupRealm': req.body.keycloakGroupRealm,
|
|
|
+ 'external-user-group:keycloak:groupSyncClientRealm': req.body.keycloakGroupSyncClientRealm,
|
|
|
'external-user-group:keycloak:groupSyncClientID': req.body.keycloakGroupSyncClientID,
|
|
|
'external-user-group:keycloak:groupSyncClientSecret': req.body.keycloakGroupSyncClientSecret,
|
|
|
'external-user-group:keycloak:autoGenerateUserOnGroupSync': req.body.autoGenerateUserOnKeycloakGroupSync,
|
|
|
@@ -312,14 +312,37 @@ module.exports = (crowi: Crowi): Router => {
|
|
|
});
|
|
|
|
|
|
router.put('/keycloak/sync', loginRequiredStrictly, adminRequired, async(req: AuthorizedRequest, res: ApiV3Response) => {
|
|
|
+ const getAuthProviderType = () => {
|
|
|
+ const kcHost = configManager?.getConfig('crowi', 'external-user-group:keycloak:host');
|
|
|
+ const kcGroupRealm = configManager?.getConfig('crowi', 'external-user-group:keycloak:groupRealm');
|
|
|
+
|
|
|
+ // starts with kcHost, contains kcGroupRealm in path
|
|
|
+ // see: https://regex101.com/r/3ihDmf/1
|
|
|
+ const regex = new RegExp(`^${kcHost}/.*/${kcGroupRealm}(/|$).*`);
|
|
|
+
|
|
|
+ const isOidcEnabled = configManager.getConfig('crowi', 'security:passport-oidc:isEnabled');
|
|
|
+ const oidcIssuerHost = configManager.getConfig('crowi', 'security:passport-oidc:issuerHost');
|
|
|
+
|
|
|
+ if (isOidcEnabled && regex.test(oidcIssuerHost)) return 'oidc';
|
|
|
+
|
|
|
+ const isSamlEnabled = configManager.getConfig('crowi', 'security:passport-saml:isEnabled');
|
|
|
+ const samlEntryPoint = configManager.getConfig('crowi', 'security:passport-saml:entryPoint');
|
|
|
+
|
|
|
+ if (isSamlEnabled && regex.test(samlEntryPoint)) return 'saml';
|
|
|
+
|
|
|
+ return null;
|
|
|
+ };
|
|
|
+
|
|
|
+ const authProviderType = getAuthProviderType();
|
|
|
+ if (authProviderType == null) return res.apiv3Err('external_user_group.keycloak.auth_not_set', 500);
|
|
|
+
|
|
|
try {
|
|
|
- const keycloakUserGroupSyncService = new KeycloakUserGroupSyncService();
|
|
|
- await keycloakUserGroupSyncService.auth();
|
|
|
+ const keycloakUserGroupSyncService = new KeycloakUserGroupSyncService(authProviderType);
|
|
|
await keycloakUserGroupSyncService.syncExternalUserGroups();
|
|
|
}
|
|
|
catch (err) {
|
|
|
logger.error(err);
|
|
|
- return res.apiv3Err(err.message, 500);
|
|
|
+ return res.apiv3Err('external_user_group.sync_failed', 500);
|
|
|
}
|
|
|
|
|
|
return res.apiv3({}, 204);
|