]> BookStack Code Mirror - bookstack/commitdiff
OIDC: Added extra userinfo content-type normalisation and test
authorDan Brown <redacted>
Thu, 28 Nov 2024 16:58:06 +0000 (16:58 +0000)
committerDan Brown <redacted>
Thu, 28 Nov 2024 16:58:06 +0000 (16:58 +0000)
During review of #5337

app/Access/Oidc/OidcUserinfoResponse.php
tests/Auth/OidcTest.php

index ffcacb8dee86982aa366a04b7b63fcee6f559b3a..33b8ec80665523a88a63ef9f3438e04546ad6d64 100644 (file)
@@ -11,7 +11,9 @@ class OidcUserinfoResponse implements ProvidesClaims
 
     public function __construct(ResponseInterface $response, string $issuer, array $keys)
     {
-        $contentType = explode(';', $response->getHeader('Content-Type')[0], 2)[0];
+        $contentTypeHeaderValue = $response->getHeader('Content-Type')[0] ?? '';
+        $contentType = strtolower(trim(explode(';', $contentTypeHeaderValue, 2)[0]));
+
         if ($contentType === 'application/json') {
             $this->claims = json_decode($response->getBody()->getContents(), true);
         }
index 201f67b533338057e13b405d611d21cd2c1b1ba6..205f75a4d62c159c2fefde68712567981c73c693 100644 (file)
@@ -787,6 +787,20 @@ class OidcTest extends TestCase
         $this->assertTrue($user->hasRole($roleA->id));
     }
 
+    public function test_userinfo_endpoint_response_with_complex_json_content_type_handled()
+    {
+        $userinfoResponseData = [
+            'sub' => OidcJwtHelper::defaultPayload()['sub'],
+            'name' => 'Barry',
+        ];
+        $userinfoResponse = new Response(200, ['Content-Type'  => 'Application/Json ; charset=utf-8'], json_encode($userinfoResponseData));
+        $resp = $this->runLogin(['name' => null], [$userinfoResponse]);
+        $resp->assertRedirect('/');
+
+        $user = User::where('email', OidcJwtHelper::defaultPayload()['email'])->first();
+        $this->assertEquals('Barry', $user->name);
+    }
+
     public function test_userinfo_endpoint_jwks_response_handled()
     {
         $userinfoResponseData = OidcJwtHelper::idToken(['name' => 'Barry Jwks']);