176 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace OAuth2\Controller;
 | |
| 
 | |
| use OAuth2\Storage\Bootstrap;
 | |
| use OAuth2\Server;
 | |
| use OAuth2\GrantType\AuthorizationCode;
 | |
| use OAuth2\Request;
 | |
| use OAuth2\Response;
 | |
| 
 | |
| class ResourceControllerTest extends \PHPUnit_Framework_TestCase
 | |
| {
 | |
|     public function testNoAccessToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 401);
 | |
|         $this->assertNull($response->getParameter('error'));
 | |
|         $this->assertNull($response->getParameter('error_description'));
 | |
|     }
 | |
| 
 | |
|     public function testMalformedHeader()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'tH1s i5 B0gU5';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 400);
 | |
|         $this->assertEquals($response->getParameter('error'), 'invalid_request');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'Malformed auth header');
 | |
|     }
 | |
| 
 | |
|     public function testMultipleTokensSubmitted()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->request['access_token'] = 'TEST';
 | |
|         $request->query['access_token'] = 'TEST';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 400);
 | |
|         $this->assertEquals($response->getParameter('error'), 'invalid_request');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'Only one method may be used to authenticate at a time (Auth header, GET or POST)');
 | |
|     }
 | |
| 
 | |
|     public function testInvalidRequestMethod()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->server['REQUEST_METHOD'] = 'GET';
 | |
|         $request->request['access_token'] = 'TEST';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 400);
 | |
|         $this->assertEquals($response->getParameter('error'), 'invalid_request');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'When putting the token in the body, the method must be POST or PUT');
 | |
|     }
 | |
| 
 | |
|     public function testInvalidContentType()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->server['REQUEST_METHOD'] = 'POST';
 | |
|         $request->server['CONTENT_TYPE'] = 'application/json';
 | |
|         $request->request['access_token'] = 'TEST';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 400);
 | |
|         $this->assertEquals($response->getParameter('error'), 'invalid_request');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'The content type for POST requests must be "application/x-www-form-urlencoded"');
 | |
|     }
 | |
| 
 | |
|     public function testInvalidToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer TESTTOKEN';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 401);
 | |
|         $this->assertEquals($response->getParameter('error'), 'invalid_token');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'The access token provided is invalid');
 | |
|     }
 | |
| 
 | |
|     public function testExpiredToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-expired';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 401);
 | |
|         $this->assertEquals($response->getParameter('error'), 'expired_token');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'The access token provided has expired');
 | |
|     }
 | |
| 
 | |
|     public function testOutOfScopeToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
 | |
|         $scope = 'outofscope';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response(), $scope);
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 403);
 | |
|         $this->assertEquals($response->getParameter('error'), 'insufficient_scope');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'The request requires higher privileges than provided by the access token');
 | |
| 
 | |
|         // verify the "scope" has been set in the "WWW-Authenticate" header
 | |
|         preg_match('/scope="(.*?)"/', $response->getHttpHeader('WWW-Authenticate'), $matches);
 | |
|         $this->assertEquals(2, count($matches));
 | |
|         $this->assertEquals($matches[1], 'outofscope');
 | |
|     }
 | |
| 
 | |
|     public function testMalformedToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-malformed';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertFalse($allow);
 | |
| 
 | |
|         $this->assertEquals($response->getStatusCode(), 401);
 | |
|         $this->assertEquals($response->getParameter('error'), 'malformed_token');
 | |
|         $this->assertEquals($response->getParameter('error_description'), 'Malformed token (missing "expires")');
 | |
|     }
 | |
| 
 | |
|     public function testValidToken()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertTrue($allow);
 | |
|     }
 | |
| 
 | |
|     public function testValidTokenWithScopeParam()
 | |
|     {
 | |
|         $server = $this->getTestServer();
 | |
|         $request = Request::createFromGlobals();
 | |
|         $request->headers['AUTHORIZATION'] = 'Bearer accesstoken-scope';
 | |
|         $request->query['scope'] = 'testscope';
 | |
|         $allow = $server->verifyResourceRequest($request, $response = new Response());
 | |
|         $this->assertTrue($allow);
 | |
|     }
 | |
| 
 | |
|     public function testCreateController()
 | |
|     {
 | |
|         $storage = Bootstrap::getInstance()->getMemoryStorage();
 | |
|         $tokenType = new \OAuth2\TokenType\Bearer();
 | |
|         $controller = new ResourceController($tokenType, $storage);
 | |
|     }
 | |
| 
 | |
|     private function getTestServer($config = array())
 | |
|     {
 | |
|         $storage = Bootstrap::getInstance()->getMemoryStorage();
 | |
|         $server = new Server($storage, $config);
 | |
| 
 | |
|         // Add the two types supported for authorization grant
 | |
|         $server->addGrantType(new AuthorizationCode($storage));
 | |
| 
 | |
|         return $server;
 | |
|     }
 | |
| }
 |