From c3cff930dc442de68fbc267d5969312a6146bd01 Mon Sep 17 00:00:00 2001 From: Demian Katz Date: Wed, 3 Jan 2024 11:54:18 -0500 Subject: [PATCH] Refactor existing logic for consistency. --- module/VuFind/src/VuFind/ILS/Driver/Folio.php | 64 ++++++++++++------- .../folio/responses/check-invalid-token.json | 2 +- .../folio/responses/get-my-profile.json | 2 +- .../folio/responses/get-proxied-users.json | 2 +- .../folio/responses/get-proxying-users.json | 2 +- .../fixtures/folio/responses/get-tokens.json | 2 +- 6 files changed, 47 insertions(+), 27 deletions(-) diff --git a/module/VuFind/src/VuFind/ILS/Driver/Folio.php b/module/VuFind/src/VuFind/ILS/Driver/Folio.php index b721a07269c..625d8392d5c 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Folio.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Folio.php @@ -32,6 +32,7 @@ use DateTime; use DateTimeZone; use Exception; +use Laminas\Http\Response; use VuFind\Exception\ILS as ILSException; use VuFind\I18n\Translator\TranslatorAwareInterface; use VuFindHttp\HttpServiceAwareInterface as HttpServiceAwareInterface; @@ -250,21 +251,14 @@ public function preRequest(\Laminas\Http\Headers $headers, $params) protected function renewTenantToken() { $this->token = null; - $auth = [ - 'username' => $this->config['API']['username'], - 'password' => $this->config['API']['password'], - ]; - $response = $this->makeRequest( - method: 'POST', - path: '/authn/login', - params: json_encode($auth), - debugParams: '{"username":"...","password":"..."}' + $response = $this->performOkapiUsernamePasswordAuthentication( + $this->config['API']['username'], + $this->config['API']['password'] ); - $this->token = $response->getHeaders()->get('X-Okapi-Token') - ->getFieldValue(); + $this->token = $this->extractTokenFromResponse($response); $this->sessionCache->folio_token = $this->token; $this->debug( - 'Token renewed. Tenant: ' . $auth['username'] . + 'Token renewed. Username: ' . $this->config['API']['username'] . ' Token: ' . substr($this->token, 0, 30) . '...' ); } @@ -870,6 +864,40 @@ protected function getDueDate($itemId, $showTime) return ''; } + /** + * Support method to perform a username/password login to Okapi. + * + * @param string $username The patron username + * @param string $password The patron password + * + * @return Response + */ + protected function performOkapiUsernamePasswordAuthentication(string $username, string $password): Response + { + $tenant = $this->config['API']['tenant']; + $credentials = compact('tenant', 'username', 'password'); + // Get token + return $this->makeRequest( + method: 'POST', + path: '/authn/login', + params: json_encode($credentials), + debugParams: '{"username":"...","password":"..."}' + ); + } + + /** + * Given a response from performOkapiUsernamePasswordAuthentication(), + * extract the token value. + * + * @param Response $response Response from performOkapiUsernamePasswordAuthentication(). + * + * @return string + */ + protected function extractTokenFromResponse(Response $response): string + { + return $response->getHeaders()->get('X-Okapi-Token')->getFieldValue(); + } + /** * Support method for patronLogin(): authenticate the patron with an Okapi * login attempt. Returns a CQL query for retrieving more information about @@ -882,22 +910,14 @@ protected function getDueDate($itemId, $showTime) */ protected function patronLoginWithOkapi($username, $password) { - $tenant = $this->config['API']['tenant']; - $credentials = compact('tenant', 'username', 'password'); - // Get token - $response = $this->makeRequest( - 'POST', - '/authn/login', - json_encode($credentials) - ); + $response = $this->performOkapiUsernamePasswordAuthentication($username, $password); $debugMsg = 'User logged in. User: ' . $username . '.'; // We've authenticated the user with Okapi, but we only have their // username; set up a query to retrieve full info below. $query = 'username == ' . $username; // Replace admin with user as tenant if configured to do so: if ($this->config['User']['use_user_token'] ?? false) { - $this->token = $response->getHeaders()->get('X-Okapi-Token') - ->getFieldValue(); + $this->token = $this->extractTokenFromResponse($response); $debugMsg .= ' Token: ' . substr($this->token, 0, 30) . '...'; } $this->debug($debugMsg); diff --git a/module/VuFind/tests/fixtures/folio/responses/check-invalid-token.json b/module/VuFind/tests/fixtures/folio/responses/check-invalid-token.json index f8389a80647..0dc0a76b216 100644 --- a/module/VuFind/tests/fixtures/folio/responses/check-invalid-token.json +++ b/module/VuFind/tests/fixtures/folio/responses/check-invalid-token.json @@ -8,7 +8,7 @@ "comment": "send new token", "expectedMethod": "POST", "expectedPath": "/authn/login", - "expectedParams": "{\"username\":\"config_username\",\"password\":\"config_password\"}", + "expectedParams": "{\"tenant\":\"config_tenant\",\"username\":\"config_username\",\"password\":\"config_password\"}", "headers": { "X-Okapi-Token": "x-okapi-token-after-invalid" } }, { diff --git a/module/VuFind/tests/fixtures/folio/responses/get-my-profile.json b/module/VuFind/tests/fixtures/folio/responses/get-my-profile.json index cbc8e4f0b8c..3dd51fa4fd2 100644 --- a/module/VuFind/tests/fixtures/folio/responses/get-my-profile.json +++ b/module/VuFind/tests/fixtures/folio/responses/get-my-profile.json @@ -6,6 +6,6 @@ "query": "id == \"foo\"" }, "status": 200, - "body": "{\n \"users\": [\n{\"username\":\"fake@example.com\",\"id\":\"foo\",\"externalSystemId\":\"fakefake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"User\",\"firstName\":\"Test\",\"middleName\":\"\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"mobilePhone\":\"1234567890\",\"addresses\":[{\"addressLine1\": \"street\", \"city\": \"city\", \"countryId\": \"country\", \"postalCode\": \"12345\"}],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-06T15:05:26.941+00:00\",\"updatedDate\":\"2023-02-06T15:05:26.941+00:00\",\"metadata\":{\"createdDate\":\"2021-03-15T20:41:34.806+00:00\",\"createdByUserId\":\"not-real\",\"updatedDate\":\"2023-02-06T15:05:26.935+00:00\",\"updatedByUserId\":\"also-not-real\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Someplace\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" + "body": "{\n \"users\": [\n{\"tenant\":\"config_tenant\",\"username\":\"fake@example.com\",\"id\":\"foo\",\"externalSystemId\":\"fakefake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"User\",\"firstName\":\"Test\",\"middleName\":\"\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"mobilePhone\":\"1234567890\",\"addresses\":[{\"addressLine1\": \"street\", \"city\": \"city\", \"countryId\": \"country\", \"postalCode\": \"12345\"}],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-06T15:05:26.941+00:00\",\"updatedDate\":\"2023-02-06T15:05:26.941+00:00\",\"metadata\":{\"createdDate\":\"2021-03-15T20:41:34.806+00:00\",\"createdByUserId\":\"not-real\",\"updatedDate\":\"2023-02-06T15:05:26.935+00:00\",\"updatedByUserId\":\"also-not-real\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Someplace\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" } ] \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/folio/responses/get-proxied-users.json b/module/VuFind/tests/fixtures/folio/responses/get-proxied-users.json index 835b7414ad4..cf68021d7b1 100644 --- a/module/VuFind/tests/fixtures/folio/responses/get-proxied-users.json +++ b/module/VuFind/tests/fixtures/folio/responses/get-proxied-users.json @@ -16,6 +16,6 @@ "query": "id == \"fakeid\"" }, "status": 200, - "body": "{\n \"users\": [\n{\"username\":\"fake@example.com\",\"id\":\"fakeid\",\"externalSystemId\":\"fake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"Lastname\",\"firstName\":\"Proxity\",\"middleName\":\"P.\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"addresses\":[],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-08T20:44:02.690+00:00\",\"updatedDate\":\"2023-02-08T20:44:02.690+00:00\",\"metadata\":{\"createdDate\":\"2021-12-14T19:23:51.863+00:00\",\"createdByUserId\":\"zzz\",\"updatedDate\":\"2023-02-08T20:44:02.681+00:00\",\"updatedByUserId\":\"yyy\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Somewhere\",\"studentGraduationStatus\":\"AW\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" + "body": "{\n \"users\": [\n{\"tenant\":\"config_tenant\",\"username\":\"fake@example.com\",\"id\":\"fakeid\",\"externalSystemId\":\"fake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"Lastname\",\"firstName\":\"Proxity\",\"middleName\":\"P.\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"addresses\":[],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-08T20:44:02.690+00:00\",\"updatedDate\":\"2023-02-08T20:44:02.690+00:00\",\"metadata\":{\"createdDate\":\"2021-12-14T19:23:51.863+00:00\",\"createdByUserId\":\"zzz\",\"updatedDate\":\"2023-02-08T20:44:02.681+00:00\",\"updatedByUserId\":\"yyy\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Somewhere\",\"studentGraduationStatus\":\"AW\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" } ] \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/folio/responses/get-proxying-users.json b/module/VuFind/tests/fixtures/folio/responses/get-proxying-users.json index 35089b20bab..a453aef0046 100644 --- a/module/VuFind/tests/fixtures/folio/responses/get-proxying-users.json +++ b/module/VuFind/tests/fixtures/folio/responses/get-proxying-users.json @@ -16,6 +16,6 @@ "query": "id == \"foo\"" }, "status": 200, - "body": "{\n \"users\": [\n{\"username\":\"fake@example.com\",\"id\":\"foo\",\"externalSystemId\":\"fake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"Lastname\",\"firstName\":\"Proxity\",\"middleName\":\"P.\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"addresses\":[],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-08T20:44:02.690+00:00\",\"updatedDate\":\"2023-02-08T20:44:02.690+00:00\",\"metadata\":{\"createdDate\":\"2021-12-14T19:23:51.863+00:00\",\"createdByUserId\":\"zzz\",\"updatedDate\":\"2023-02-08T20:44:02.681+00:00\",\"updatedByUserId\":\"yyy\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Somewhere\",\"studentGraduationStatus\":\"AW\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" + "body": "{\n \"users\": [\n{\"tenant\":\"config_tenant\",\"username\":\"fake@example.com\",\"id\":\"foo\",\"externalSystemId\":\"fake\",\"barcode\":\"fakefakefake\",\"active\":true,\"patronGroup\":\"fakegroup\",\"departments\":[],\"proxyFor\":[],\"personal\":{\"lastName\":\"Lastname\",\"firstName\":\"Proxity\",\"middleName\":\"P.\",\"email\":\"fake@example.com\",\"phone\":\"0123456789\",\"addresses\":[],\"preferredContactTypeId\":\"002\"},\"expirationDate\":\"2030-05-30T00:00:00.000+00:00\",\"createdDate\":\"2023-02-08T20:44:02.690+00:00\",\"updatedDate\":\"2023-02-08T20:44:02.690+00:00\",\"metadata\":{\"createdDate\":\"2021-12-14T19:23:51.863+00:00\",\"createdByUserId\":\"zzz\",\"updatedDate\":\"2023-02-08T20:44:02.681+00:00\",\"updatedByUserId\":\"yyy\"},\"customFields\":{\"employeeClass\":\"Staff\",\"title\":\"Mr.\",\"employeeStatus\":\"Full Time\",\"employeeDepartment\":\"Somewhere\",\"studentGraduationStatus\":\"AW\"}}],\n \"totalRecords\": 1,\n \"resultInfo\": {\"totalRecords\":1,\"facets\":[],\"diagnostics\":[]}\n}" } ] \ No newline at end of file diff --git a/module/VuFind/tests/fixtures/folio/responses/get-tokens.json b/module/VuFind/tests/fixtures/folio/responses/get-tokens.json index 0ac5051e889..e969a1892dc 100644 --- a/module/VuFind/tests/fixtures/folio/responses/get-tokens.json +++ b/module/VuFind/tests/fixtures/folio/responses/get-tokens.json @@ -2,7 +2,7 @@ { "comment": "Initial request for token", "expectedMethod": "POST", - "expectedParams": "{\"username\":\"config_username\",\"password\":\"config_password\"}", + "expectedParams": "{\"tenant\":\"config_tenant\",\"username\":\"config_username\",\"password\":\"config_password\"}", "expectedPath": "/authn/login", "expectedHeaders": { "X-Okapi-Tenant": "config_tenant" }, "headers": { "X-Okapi-Token": "x-okapi-token-config-tenant" }