Skip to content

Commit bb24726

Browse files
authored
Fix Cloudflare token verification (#917)
1 parent 2b3c1eb commit bb24726

File tree

2 files changed

+12
-11
lines changed

2 files changed

+12
-11
lines changed

app/DNSProviders/Cloudflare.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,16 @@ public function credentialData(array $input): array
4848
public function connect(array $credentials): bool
4949
{
5050
try {
51+
// Use /zones endpoint to verify token works for both user-scoped and account-scoped tokens
52+
// This also verifies the token has Zone:Read permissions which we need
5153
$response = Http::withHeaders([
5254
'Authorization' => 'Bearer '.$credentials['token'],
5355
'Content-Type' => 'application/json',
54-
])->baseUrl(self::API_BASE_URL)
55-
->get('user/tokens/verify');
56+
])
57+
->baseUrl(self::API_BASE_URL)
58+
->get('zones', ['per_page' => 1]);
5659

57-
if ($response->successful() && $response->json('success')) {
60+
if ($response->successful() && $response->json('success') !== false) {
5861
return true;
5962
}
6063

tests/Unit/DNSProviders/CloudflareTest.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,9 @@ public function test_credential_data(): void
5959
public function test_connect_success(): void
6060
{
6161
Http::fake([
62-
'api.cloudflare.com/client/v4/user/tokens/verify' => Http::response([
62+
'api.cloudflare.com/client/v4/zones*' => Http::response([
6363
'success' => true,
64-
'result' => [
65-
'id' => 'test-id',
66-
'status' => 'active',
67-
],
64+
'result' => [],
6865
], 200),
6966
]);
7067

@@ -75,7 +72,8 @@ public function test_connect_success(): void
7572
$this->assertTrue($result);
7673

7774
Http::assertSent(function (Request $request) {
78-
return str_contains($request->url(), 'api.cloudflare.com/client/v4/user/tokens/verify')
75+
return str_contains($request->url(), 'api.cloudflare.com/client/v4/zones')
76+
&& str_contains($request->url(), 'per_page=1')
7977
&& $request->header('Authorization')[0] === 'Bearer test-token-123'
8078
&& $request->header('Content-Type')[0] === 'application/json';
8179
});
@@ -84,7 +82,7 @@ public function test_connect_success(): void
8482
public function test_connect_failure_invalid_response(): void
8583
{
8684
Http::fake([
87-
'api.cloudflare.com/client/v4/user/tokens/verify' => Http::response([
85+
'api.cloudflare.com/client/v4/zones*' => Http::response([
8886
'success' => false,
8987
'errors' => [
9088
['message' => 'Invalid token'],
@@ -102,7 +100,7 @@ public function test_connect_failure_invalid_response(): void
102100
public function test_connect_failure_http_error(): void
103101
{
104102
Http::fake([
105-
'api.cloudflare.com/client/v4/user/tokens/verify' => Http::response([], 401),
103+
'api.cloudflare.com/client/v4/zones*' => Http::response([], 401),
106104
]);
107105

108106
$credentials = ['token' => 'invalid-token'];

0 commit comments

Comments
 (0)