mirror of
https://github.com/logto-io/logto.git
synced 2025-03-31 22:51:25 -05:00
feat(core): enable userinfo endpoint (#1783)
* feat(core): enable userinfo endpoint * fix(deps): move snake-case to production deps
This commit is contained in:
parent
8bdc46bc3f
commit
a6bb2f7ec2
3 changed files with 48 additions and 22 deletions
|
@ -71,6 +71,7 @@
|
|||
"slonik": "^30.0.0",
|
||||
"slonik-interceptor-preset": "^1.2.10",
|
||||
"slonik-sql-tag-raw": "^1.1.4",
|
||||
"snake-case": "^3.0.4",
|
||||
"snakecase-keys": "^5.1.0",
|
||||
"zod": "^3.14.3"
|
||||
},
|
||||
|
@ -101,7 +102,6 @@
|
|||
"nock": "^13.2.2",
|
||||
"openapi-types": "^12.0.0",
|
||||
"prettier": "^2.7.1",
|
||||
"snake-case": "^3.0.4",
|
||||
"supertest": "^6.2.2",
|
||||
"tsc-watch": "^5.0.0",
|
||||
"typescript": "^4.7.4"
|
||||
|
|
|
@ -2,10 +2,12 @@
|
|||
|
||||
import { readFileSync } from 'fs';
|
||||
|
||||
import { CustomClientMetadataKey } from '@logto/schemas';
|
||||
import { CustomClientMetadataKey, userInfoSelectFields } from '@logto/schemas';
|
||||
import Koa from 'koa';
|
||||
import mount from 'koa-mount';
|
||||
import pick from 'lodash.pick';
|
||||
import { Provider, errors } from 'oidc-provider';
|
||||
import { snakeCase } from 'snake-case';
|
||||
import snakecaseKeys from 'snakecase-keys';
|
||||
|
||||
import envSet from '@/env-set';
|
||||
|
@ -40,8 +42,9 @@ export default async function initOidc(app: Koa): Promise<Provider> {
|
|||
jwks: {
|
||||
keys: privateJwks,
|
||||
},
|
||||
conformIdTokenClaims: false,
|
||||
features: {
|
||||
userinfo: { enabled: false },
|
||||
userinfo: { enabled: true },
|
||||
revocation: { enabled: true },
|
||||
devInteractions: { enabled: false },
|
||||
rpInitiatedLogout: {
|
||||
|
@ -97,22 +100,27 @@ export default async function initOidc(app: Koa): Promise<Provider> {
|
|||
isOriginAllowed(origin, client.metadata(), client.redirectUris),
|
||||
// https://github.com/panva/node-oidc-provider/blob/main/recipes/claim_configuration.md
|
||||
claims: {
|
||||
profile: ['username', 'name', 'avatar', 'role_names'],
|
||||
profile: userInfoSelectFields.map((value) => snakeCase(value)),
|
||||
},
|
||||
// https://github.com/panva/node-oidc-provider/tree/main/docs#findaccount
|
||||
findAccount: async (_ctx, sub) => {
|
||||
const { username, name, avatar, roleNames } = await findUserById(sub);
|
||||
const user = await findUserById(sub);
|
||||
const { username, name, avatar, roleNames } = user;
|
||||
|
||||
return {
|
||||
accountId: sub,
|
||||
claims: async () => {
|
||||
return snakecaseKeys({
|
||||
sub,
|
||||
username,
|
||||
name,
|
||||
avatar,
|
||||
roleNames,
|
||||
});
|
||||
claims: async (use) => {
|
||||
return snakecaseKeys(
|
||||
{
|
||||
sub,
|
||||
username,
|
||||
name,
|
||||
avatar,
|
||||
roleNames,
|
||||
...(use === 'userinfo' && pick(user, ...userInfoSelectFields)),
|
||||
},
|
||||
{ deep: false }
|
||||
);
|
||||
},
|
||||
};
|
||||
},
|
||||
|
|
36
pnpm-lock.yaml
generated
36
pnpm-lock.yaml
generated
|
@ -1043,6 +1043,7 @@ importers:
|
|||
slonik: 30.1.2
|
||||
slonik-interceptor-preset: 1.2.10
|
||||
slonik-sql-tag-raw: 1.1.4_roarr@7.11.0+slonik@30.1.2
|
||||
snake-case: 3.0.4
|
||||
snakecase-keys: 5.1.2
|
||||
zod: 3.14.3
|
||||
devDependencies:
|
||||
|
@ -1072,7 +1073,6 @@ importers:
|
|||
nock: 13.2.2
|
||||
openapi-types: 12.0.0
|
||||
prettier: 2.7.1
|
||||
snake-case: 3.0.4
|
||||
supertest: 6.2.2
|
||||
tsc-watch: 5.0.3_typescript@4.7.4
|
||||
typescript: 4.7.4
|
||||
|
@ -1987,6 +1987,7 @@ packages:
|
|||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@jridgewell/trace-mapping': 0.3.9
|
||||
dev: true
|
||||
|
||||
/@csstools/selector-specificity/2.0.2_444rcjjorr3kpoqtvoodsr46pu:
|
||||
resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==}
|
||||
|
@ -2128,7 +2129,6 @@ packages:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/@jest/core/28.1.3_ts-node@10.9.1:
|
||||
resolution: {integrity: sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==}
|
||||
|
@ -2171,6 +2171,7 @@ packages:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/@jest/environment/27.5.1:
|
||||
resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==}
|
||||
|
@ -2376,6 +2377,7 @@ packages:
|
|||
dependencies:
|
||||
'@jridgewell/resolve-uri': 3.0.5
|
||||
'@jridgewell/sourcemap-codec': 1.4.11
|
||||
dev: true
|
||||
|
||||
/@koa/cors/3.1.0:
|
||||
resolution: {integrity: sha512-7ulRC1da/rBa6kj6P4g2aJfnET3z8Uf3SWu60cjbtxTA5g8lxRdX/Bd2P92EagGwwAhANeNw8T8if99rJliR6Q==}
|
||||
|
@ -4615,7 +4617,7 @@ packages:
|
|||
'@jest/types': 28.1.3
|
||||
deepmerge: 4.2.2
|
||||
identity-obj-proxy: 3.0.0
|
||||
jest: 28.1.3_k5ytkvaprncdyzidqqws5bqksq
|
||||
jest: 28.1.3_@types+node@16.11.12
|
||||
jest-matcher-specific-error: 1.0.0
|
||||
jest-transform-stub: 2.0.0
|
||||
ts-jest: 28.0.7_lhw3xkmzugq5tscs3x2ndm4sby
|
||||
|
@ -4863,15 +4865,19 @@ packages:
|
|||
|
||||
/@tsconfig/node10/1.0.8:
|
||||
resolution: {integrity: sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node12/1.0.9:
|
||||
resolution: {integrity: sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node14/1.0.1:
|
||||
resolution: {integrity: sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==}
|
||||
dev: true
|
||||
|
||||
/@tsconfig/node16/1.0.2:
|
||||
resolution: {integrity: sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==}
|
||||
dev: true
|
||||
|
||||
/@types/accepts/1.3.5:
|
||||
resolution: {integrity: sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==}
|
||||
|
@ -5544,6 +5550,7 @@ packages:
|
|||
/acorn-walk/8.2.0:
|
||||
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
dev: true
|
||||
|
||||
/acorn/7.4.1:
|
||||
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
|
||||
|
@ -5561,6 +5568,7 @@ packages:
|
|||
resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
hasBin: true
|
||||
dev: true
|
||||
|
||||
/acorn/8.8.0:
|
||||
resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==}
|
||||
|
@ -5710,6 +5718,7 @@ packages:
|
|||
|
||||
/arg/4.1.3:
|
||||
resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
|
||||
dev: true
|
||||
|
||||
/argon2/0.28.5:
|
||||
resolution: {integrity: sha512-kGFCctzc3VWmR1aCOYjNgvoTmVF5uVBUtWlXCKKO54d1K+31zRz45KAcDIqMo2746ozv/52d25nfEekitaXP0w==}
|
||||
|
@ -6658,8 +6667,8 @@ packages:
|
|||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
is-text-path: 1.0.1
|
||||
JSONStream: 1.3.5
|
||||
is-text-path: 1.0.1
|
||||
lodash: 4.17.21
|
||||
meow: 8.1.2
|
||||
split2: 3.2.2
|
||||
|
@ -6771,6 +6780,7 @@ packages:
|
|||
|
||||
/create-require/1.1.1:
|
||||
resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
|
||||
dev: true
|
||||
|
||||
/cross-env/7.0.3:
|
||||
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
|
||||
|
@ -7153,6 +7163,7 @@ packages:
|
|||
/diff/4.0.2:
|
||||
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
|
||||
engines: {node: '>=0.3.1'}
|
||||
dev: true
|
||||
|
||||
/diff/5.0.0:
|
||||
resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
|
||||
|
@ -7237,6 +7248,7 @@ packages:
|
|||
dependencies:
|
||||
no-case: 3.0.4
|
||||
tslib: 2.4.0
|
||||
dev: false
|
||||
|
||||
/dot-prop/5.3.0:
|
||||
resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
|
||||
|
@ -9709,7 +9721,6 @@ packages:
|
|||
- '@types/node'
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/jest-cli/28.1.3_k5ytkvaprncdyzidqqws5bqksq:
|
||||
resolution: {integrity: sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==}
|
||||
|
@ -9737,6 +9748,7 @@ packages:
|
|||
- '@types/node'
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/jest-config/28.1.3:
|
||||
resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
|
||||
|
@ -9813,7 +9825,6 @@ packages:
|
|||
strip-json-comments: 3.1.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/jest-config/28.1.3_@types+node@17.0.23:
|
||||
resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
|
||||
|
@ -9852,7 +9863,6 @@ packages:
|
|||
strip-json-comments: 3.1.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/jest-config/28.1.3_hvivgrlmkyd4vgu6rkkmg6acly:
|
||||
resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
|
||||
|
@ -9892,6 +9902,7 @@ packages:
|
|||
ts-node: 10.9.1_ccwudyfw5se7hgalwgkzhn2yp4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/jest-config/28.1.3_k5ytkvaprncdyzidqqws5bqksq:
|
||||
resolution: {integrity: sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==}
|
||||
|
@ -9931,6 +9942,7 @@ packages:
|
|||
ts-node: 10.9.1_ccwudyfw5se7hgalwgkzhn2yp4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/jest-dev-server/6.1.1:
|
||||
resolution: {integrity: sha512-z5LnaGDvlIkdMv/rppSO4+rq+GyQKf1xI9oiBxf9/2EBeN2hxRaWiMvaLNDnHPZj2PAhBXsycrKslDDoZO2Xtw==}
|
||||
|
@ -10356,7 +10368,6 @@ packages:
|
|||
- '@types/node'
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/jest/28.1.3_k5ytkvaprncdyzidqqws5bqksq:
|
||||
resolution: {integrity: sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==}
|
||||
|
@ -10376,6 +10387,7 @@ packages:
|
|||
- '@types/node'
|
||||
- supports-color
|
||||
- ts-node
|
||||
dev: true
|
||||
|
||||
/joi/17.6.0:
|
||||
resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==}
|
||||
|
@ -11050,6 +11062,7 @@ packages:
|
|||
resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
|
||||
dependencies:
|
||||
tslib: 2.4.0
|
||||
dev: false
|
||||
|
||||
/lowercase-keys/1.0.1:
|
||||
resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
|
||||
|
@ -11949,6 +11962,7 @@ packages:
|
|||
dependencies:
|
||||
lower-case: 2.0.2
|
||||
tslib: 2.4.0
|
||||
dev: false
|
||||
|
||||
/nock/13.2.2:
|
||||
resolution: {integrity: sha512-PcBHuvl9i6zfaJ50A7LS55oU+nFLv8htXIhffJO+FxyfibdZ4jEvd9kTuvkrJireBFIGMZ+oUIRpMK5gU9h//g==}
|
||||
|
@ -14628,6 +14642,7 @@ packages:
|
|||
dependencies:
|
||||
dot-case: 3.0.4
|
||||
tslib: 2.3.1
|
||||
dev: false
|
||||
|
||||
/snakecase-keys/5.1.2:
|
||||
resolution: {integrity: sha512-fvtDQZqPBqYb0dEY97TGuOMbN2NJ05Tj4MaoKwjTKkmjcG6mrd58JYGr23UWZRi6Aqv49Fk4HtjTIStOQenaug==}
|
||||
|
@ -15490,7 +15505,7 @@ packages:
|
|||
'@jest/types': 28.1.3
|
||||
bs-logger: 0.2.6
|
||||
fast-json-stable-stringify: 2.1.0
|
||||
jest: 28.1.3_k5ytkvaprncdyzidqqws5bqksq
|
||||
jest: 28.1.3_@types+node@16.11.12
|
||||
jest-util: 28.1.3
|
||||
json5: 2.2.1
|
||||
lodash.memoize: 4.1.2
|
||||
|
@ -15559,6 +15574,7 @@ packages:
|
|||
typescript: 4.7.4
|
||||
v8-compile-cache-lib: 3.0.1
|
||||
yn: 3.1.1
|
||||
dev: true
|
||||
|
||||
/tsc-watch/5.0.3_typescript@4.7.4:
|
||||
resolution: {integrity: sha512-Hz2UawwELMSLOf0xHvAFc7anLeMw62cMVXr1flYmhRuOhOyOljwmb1l/O60ZwRyy1k7N1iC1mrn1QYM2zITfuw==}
|
||||
|
@ -15940,6 +15956,7 @@ packages:
|
|||
|
||||
/v8-compile-cache-lib/3.0.1:
|
||||
resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
|
||||
dev: true
|
||||
|
||||
/v8-compile-cache/2.3.0:
|
||||
resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
|
||||
|
@ -16364,6 +16381,7 @@ packages:
|
|||
/yn/3.1.1:
|
||||
resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
|
||||
engines: {node: '>=6'}
|
||||
dev: true
|
||||
|
||||
/yocto-queue/0.1.0:
|
||||
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
|
||||
|
|
Loading…
Add table
Reference in a new issue