From 53850201a11b7e833fdd10ce309146f3428f29ed Mon Sep 17 00:00:00 2001 From: Jeffrey Date: Tue, 8 Aug 2023 21:40:11 -0500 Subject: [PATCH] - created identity_provider_user table - updated exchange to use new table --- .../api/controllers/access-tokens/exchange.js | 16 +++++++++++++- server/api/models/IdentityProviderUser.js | 17 +++++++------- server/api/models/User.js | 4 ++++ ...809022050_create_identity_provider_user.js | 22 +++++++++++++++++++ 4 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 server/db/migrations/20230809022050_create_identity_provider_user.js diff --git a/server/api/controllers/access-tokens/exchange.js b/server/api/controllers/access-tokens/exchange.js index 2ecce42..2d3d90b 100644 --- a/server/api/controllers/access-tokens/exchange.js +++ b/server/api/controllers/access-tokens/exchange.js @@ -106,7 +106,21 @@ module.exports = { updatedAt: now, }; - const user = await User.findOrCreate({ username: userInfo.preferred_username }, newUser); + const identityProviderUser = await IdentityProviderUser.findOne({ + where: { + issuer: oidcUser.iss, + sub: oidcUser.sub, + }, + }).populate('userId'); + let user = identityProviderUser ? identityProviderUser.userId : {}; + if (!identityProviderUser) { + user = await User.create(newUser).fetch(); + await IdentityProviderUser.create({ + issuer: oidcUser.iss, + sub: oidcUser.sub, + userId: user.id, + }); + } const controlledFields = ['email', 'password', 'isAdmin', 'name', 'username']; const updateFields = {}; diff --git a/server/api/models/IdentityProviderUser.js b/server/api/models/IdentityProviderUser.js index 459923e..c4ae005 100644 --- a/server/api/models/IdentityProviderUser.js +++ b/server/api/models/IdentityProviderUser.js @@ -1,5 +1,5 @@ /** - * IdentityProviderUser.js + * ProjectManager.js * * @description :: A model definition represents a database table/collection. * @docs :: https://sailsjs.com/docs/concepts/models-and-orm/models @@ -7,20 +7,19 @@ module.exports = { attributes: { - // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗ - // ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗ - // ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝ - issuer: { - type: 'issuer', + type: 'string', isNotEmptyString: true, - required: true, + allowNull: true, }, sub: { - type: 'sub', - required: true, + type: 'string', isNotEmptyString: true, + allowNull: true, }, + // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗ + // ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗ + // ╩ ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝ // ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗ // ║╣ ║║║╠╩╗║╣ ║║╚═╗ diff --git a/server/api/models/User.js b/server/api/models/User.js index 65cd307..279f249 100755 --- a/server/api/models/User.js +++ b/server/api/models/User.js @@ -97,6 +97,10 @@ module.exports = { via: 'userId', through: 'CardMembership', }, + identityProviders: { + collection: 'IdentityProviderUser', + via: 'userId', + }, }, tableName: 'user_account', diff --git a/server/db/migrations/20230809022050_create_identity_provider_user.js b/server/db/migrations/20230809022050_create_identity_provider_user.js new file mode 100644 index 0000000..a382ec4 --- /dev/null +++ b/server/db/migrations/20230809022050_create_identity_provider_user.js @@ -0,0 +1,22 @@ +module.exports.up = (knex) => + knex.schema.createTable('identity_provider_user', (table) => { + /* Columns */ + + table.bigInteger('id').primary().defaultTo(knex.raw('next_id()')); + + table + .bigInteger('user_id') + .notNullable() + .references('id') + .inTable('user_account') + .onDelete('CASCADE'); + + table.text('issuer').notNullable(); + table.text('sub').notNullable(); + + /* Indexes */ + + table.index('user_id'); + }); + +module.exports.down = (knex) => knex.schema.dropTable('identity_provider_user');