source: vendor/google/auth/src/CredentialSource/UrlSource.php@ f9c482b

Last change on this file since f9c482b was f9c482b, checked in by Vlado 222039 <vlado.popovski@…>, 7 days ago

Upload new project files

  • Property mode set to 100644
File size: 3.4 KB
Line 
1<?php
2/*
3 * Copyright 2023 Google Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18namespace Google\Auth\CredentialSource;
19
20use Google\Auth\ExternalAccountCredentialSourceInterface;
21use Google\Auth\HttpHandler\HttpClientCache;
22use Google\Auth\HttpHandler\HttpHandlerFactory;
23use GuzzleHttp\Psr7\Request;
24use InvalidArgumentException;
25use UnexpectedValueException;
26
27/**
28 * Retrieve a token from a URL.
29 */
30class UrlSource implements ExternalAccountCredentialSourceInterface
31{
32 private string $url;
33 private ?string $format;
34 private ?string $subjectTokenFieldName;
35
36 /**
37 * @var array<string, string|string[]>
38 */
39 private ?array $headers;
40
41 /**
42 * @param string $url The URL to fetch the subject token from.
43 * @param string|null $format The format of the token in the response. Can be null or "json".
44 * @param string|null $subjectTokenFieldName The name of the field containing the token in the response. This is required
45 * when format is "json".
46 * @param array<string, string|string[]>|null $headers Request headers to send in with the request to the URL.
47 */
48 public function __construct(
49 string $url,
50 ?string $format = null,
51 ?string $subjectTokenFieldName = null,
52 ?array $headers = null
53 ) {
54 $this->url = $url;
55
56 if ($format === 'json' && is_null($subjectTokenFieldName)) {
57 throw new InvalidArgumentException(
58 'subject_token_field_name must be set when format is JSON'
59 );
60 }
61
62 $this->format = $format;
63 $this->subjectTokenFieldName = $subjectTokenFieldName;
64 $this->headers = $headers;
65 }
66
67 public function fetchSubjectToken(?callable $httpHandler = null): string
68 {
69 if (is_null($httpHandler)) {
70 $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient());
71 }
72
73 $request = new Request(
74 'GET',
75 $this->url,
76 $this->headers ?: []
77 );
78
79 $response = $httpHandler($request);
80 $body = (string) $response->getBody();
81 if ($this->format === 'json') {
82 if (!$json = json_decode((string) $body, true)) {
83 throw new UnexpectedValueException(
84 'Unable to decode JSON response'
85 );
86 }
87 if (!isset($json[$this->subjectTokenFieldName])) {
88 throw new UnexpectedValueException(
89 'subject_token_field_name not found in JSON file'
90 );
91 }
92 $body = $json[$this->subjectTokenFieldName];
93 }
94
95 return $body;
96 }
97
98 /**
99 * Get the cache key for the credentials.
100 * The format for the cache key is:
101 * URL
102 *
103 * @return ?string
104 */
105 public function getCacheKey(): ?string
106 {
107 return $this->url;
108 }
109}
Note: See TracBrowser for help on using the repository browser.