Skip to content

Commit e826aaf

Browse files
ApacheExbshaffer
authored andcommitted
Fix CORS issue for revoking and requesting an access token (bshaffer#829)
1 parent 5abe923 commit e826aaf

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

src/OAuth2/Controller/TokenController.php

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,15 @@ public function handleTokenRequest(RequestInterface $request, ResponseInterface
118118
*/
119119
public function grantAccessToken(RequestInterface $request, ResponseInterface $response)
120120
{
121-
if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
121+
if (strtolower($request->server('REQUEST_METHOD')) === 'options') {
122+
$response->addHttpHeaders(array('Allow' => 'POST, OPTIONS'));
123+
124+
return null;
125+
}
126+
127+
if (strtolower($request->server('REQUEST_METHOD')) !== 'post') {
122128
$response->setError(405, 'invalid_request', 'The request method must be POST when requesting an access token', '#section-3.2');
123-
$response->addHttpHeaders(array('Allow' => 'POST'));
129+
$response->addHttpHeaders(array('Allow' => 'POST, OPTIONS'));
124130

125131
return null;
126132
}
@@ -287,9 +293,15 @@ public function handleRevokeRequest(RequestInterface $request, ResponseInterface
287293
*/
288294
public function revokeToken(RequestInterface $request, ResponseInterface $response)
289295
{
290-
if (strtolower($request->server('REQUEST_METHOD')) != 'post') {
296+
if (strtolower($request->server('REQUEST_METHOD')) === 'options') {
297+
$response->addHttpHeaders(array('Allow' => 'POST, OPTIONS'));
298+
299+
return null;
300+
}
301+
302+
if (strtolower($request->server('REQUEST_METHOD')) !== 'post') {
291303
$response->setError(405, 'invalid_request', 'The request method must be POST when revoking an access token', '#section-3.2');
292-
$response->addHttpHeaders(array('Allow' => 'POST'));
304+
$response->addHttpHeaders(array('Allow' => 'POST, OPTIONS'));
293305

294306
return null;
295307
}
@@ -318,4 +330,4 @@ public function revokeToken(RequestInterface $request, ResponseInterface $respon
318330

319331
return true;
320332
}
321-
}
333+
}

test/OAuth2/Controller/TokenControllerTest.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,48 @@ public function testInvalidRequestMethodForRevoke()
271271
$this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when revoking an access token');
272272
}
273273

274+
public function testCanUseCrossOriginRequestForRevoke()
275+
{
276+
$server = $this->getTestServer();
277+
278+
$request = new TestRequest();
279+
$request->setMethod('OPTIONS');
280+
281+
$server->handleRevokeRequest($request, $response = new Response());
282+
$this->assertTrue($response instanceof Response);
283+
$this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
284+
$this->assertEquals($response->getHttpHeader('Allow'), 'POST, OPTIONS');
285+
}
286+
287+
public function testInvalidRequestMethodForAccessToken()
288+
{
289+
$server = $this->getTestServer();
290+
291+
$request = new TestRequest();
292+
$request->setQuery(array(
293+
'token_type_hint' => 'access_token'
294+
));
295+
296+
$server->handleTokenRequest($request, $response = new Response());
297+
$this->assertTrue($response instanceof Response);
298+
$this->assertEquals(405, $response->getStatusCode(), var_export($response, 1));
299+
$this->assertEquals($response->getParameter('error'), 'invalid_request');
300+
$this->assertEquals($response->getParameter('error_description'), 'The request method must be POST when requesting an access token');
301+
}
302+
303+
public function testCanUseCrossOriginRequestForAccessToken()
304+
{
305+
$server = $this->getTestServer();
306+
307+
$request = new TestRequest();
308+
$request->setMethod('OPTIONS');
309+
310+
$server->handleTokenRequest($request, $response = new Response());
311+
$this->assertTrue($response instanceof Response);
312+
$this->assertEquals(200, $response->getStatusCode(), var_export($response, 1));
313+
$this->assertEquals($response->getHttpHeader('Allow'), 'POST, OPTIONS');
314+
}
315+
274316
public function testCreateController()
275317
{
276318
$storage = Bootstrap::getInstance()->getMemoryStorage();

test/lib/OAuth2/Request/TestRequest.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,14 @@ public function setQuery(array $query)
4545
$this->query = $query;
4646
}
4747

48+
public function setMethod($method)
49+
{
50+
$this->server['REQUEST_METHOD'] = $method;
51+
}
52+
4853
public function setPost(array $params)
4954
{
50-
$this->server['REQUEST_METHOD'] = 'POST';
55+
$this->setMethod('POST');
5156
$this->request = $params;
5257
}
5358

0 commit comments

Comments
 (0)