3 namespace BookStack\Access\Oidc;
5 use Illuminate\Support\Arr;
9 public function __construct(
10 public ?string $externalId = null,
11 public ?string $email = null,
12 public ?string $name = null,
13 public ?array $groups = null,
18 * Check if the user details are fully populated for our usage.
20 public function isFullyPopulated(bool $groupSyncActive): bool
22 $hasEmpty = empty($this->externalId)
23 || empty($this->email)
25 || ($groupSyncActive && empty($this->groups));
31 * Populate user details from OidcIdToken data.
33 public static function fromToken(
36 string $displayNameClaims,
39 $id = $token->getClaim($idClaim);
43 email: $token->getClaim('email'),
44 name: static::getUserDisplayName($displayNameClaims, $token, $id),
45 groups: static::getUserGroups($groupsClaim, $token),
49 protected static function getUserDisplayName(string $displayNameClaims, OidcIdToken $token, string $defaultValue): string
51 $displayNameClaimParts = explode('|', $displayNameClaims);
54 foreach ($displayNameClaimParts as $claim) {
55 $component = $token->getClaim(trim($claim)) ?? '';
56 if ($component !== '') {
57 $displayName[] = $component;
61 if (count($displayName) === 0) {
62 $displayName[] = $defaultValue;
65 return implode(' ', $displayName);
68 protected static function getUserGroups(string $groupsClaim, OidcIdToken $token): array
70 if (empty($groupsClaim)) {
74 $groupsList = Arr::get($token->getAllClaims(), $groupsClaim);
75 if (!is_array($groupsList)) {
79 return array_values(array_filter($groupsList, function ($val) {
80 return is_string($val);