345 lines
12 KiB
PHP
345 lines
12 KiB
PHP
<?php
|
|
/*
|
|
* Copyright 2015 Google Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
namespace Google\Auth\Tests;
|
|
|
|
use Google\Auth\FetchAuthTokenCache;
|
|
use Google\Auth\Middleware\AuthTokenMiddleware;
|
|
use GuzzleHttp\Handler\MockHandler;
|
|
use GuzzleHttp\Psr7\Response;
|
|
|
|
class AuthTokenMiddlewareTest extends BaseTest
|
|
{
|
|
private $mockFetcher;
|
|
private $mockCacheItem;
|
|
private $mockCache;
|
|
private $mockRequest;
|
|
|
|
protected function setUp()
|
|
{
|
|
$this->onlyGuzzle6();
|
|
|
|
$this->mockFetcher =
|
|
$this
|
|
->getMockBuilder('Google\Auth\FetchAuthTokenInterface')
|
|
->getMock();
|
|
$this->mockCacheItem =
|
|
$this
|
|
->getMockBuilder('Psr\Cache\CacheItemInterface')
|
|
->getMock();
|
|
$this->mockCache =
|
|
$this
|
|
->getMockBuilder('Psr\Cache\CacheItemPoolInterface')
|
|
->getMock();
|
|
$this->mockRequest =
|
|
$this
|
|
->getMockBuilder('GuzzleHttp\Psr7\Request')
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
}
|
|
|
|
public function testOnlyTouchesWhenAuthConfigScoped()
|
|
{
|
|
$this->mockFetcher
|
|
->expects($this->any())
|
|
->method('fetchAuthToken')
|
|
->will($this->returnValue([]));
|
|
$this->mockRequest
|
|
->expects($this->never())
|
|
->method('withHeader');
|
|
|
|
$middleware = new AuthTokenMiddleware($this->mockFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'not_google_auth']);
|
|
}
|
|
|
|
public function testAddsTheTokenAsAnAuthorizationHeader()
|
|
{
|
|
$authResult = ['access_token' => '1/abcdef1234567890'];
|
|
$this->mockFetcher
|
|
->expects($this->once())
|
|
->method('fetchAuthToken')
|
|
->will($this->returnValue($authResult));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->with('authorization', 'Bearer ' . $authResult['access_token'])
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
// Run the test.
|
|
$middleware = new AuthTokenMiddleware($this->mockFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
}
|
|
|
|
public function testDoesNotAddAnAuthorizationHeaderOnNoAccessToken()
|
|
{
|
|
$authResult = ['not_access_token' => '1/abcdef1234567890'];
|
|
$this->mockFetcher
|
|
->expects($this->once())
|
|
->method('fetchAuthToken')
|
|
->will($this->returnValue($authResult));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->with('authorization', 'Bearer ')
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
// Run the test.
|
|
$middleware = new AuthTokenMiddleware($this->mockFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
}
|
|
|
|
public function testUsesCachedAuthToken()
|
|
{
|
|
$cacheKey = 'myKey';
|
|
$cachedValue = '2/abcdef1234567890';
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('isHit')
|
|
->will($this->returnValue(true));
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('get')
|
|
->will($this->returnValue($cachedValue));
|
|
$this->mockCache
|
|
->expects($this->once())
|
|
->method('getItem')
|
|
->with($this->equalTo($cacheKey))
|
|
->will($this->returnValue($this->mockCacheItem));
|
|
$this->mockFetcher
|
|
->expects($this->never())
|
|
->method('fetchAuthToken');
|
|
$this->mockFetcher
|
|
->expects($this->any())
|
|
->method('getCacheKey')
|
|
->will($this->returnValue($cacheKey));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->with('authorization', 'Bearer ' . $cachedValue)
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
// Run the test.
|
|
$cachedFetcher = new FetchAuthTokenCache(
|
|
$this->mockFetcher,
|
|
null,
|
|
$this->mockCache
|
|
);
|
|
$middleware = new AuthTokenMiddleware($cachedFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
}
|
|
|
|
public function testGetsCachedAuthTokenUsingCacheOptions()
|
|
{
|
|
$prefix = 'test_prefix_';
|
|
$cacheKey = 'myKey';
|
|
$cachedValue = '2/abcdef1234567890';
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('isHit')
|
|
->will($this->returnValue(true));
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('get')
|
|
->will($this->returnValue($cachedValue));
|
|
$this->mockCache
|
|
->expects($this->once())
|
|
->method('getItem')
|
|
->with($this->equalTo($prefix . $cacheKey))
|
|
->will($this->returnValue($this->mockCacheItem));
|
|
$this->mockFetcher
|
|
->expects($this->never())
|
|
->method('fetchAuthToken');
|
|
$this->mockFetcher
|
|
->expects($this->any())
|
|
->method('getCacheKey')
|
|
->will($this->returnValue($cacheKey));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->with('authorization', 'Bearer ' . $cachedValue)
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
// Run the test.
|
|
$cachedFetcher = new FetchAuthTokenCache(
|
|
$this->mockFetcher,
|
|
['prefix' => $prefix],
|
|
$this->mockCache
|
|
);
|
|
$middleware = new AuthTokenMiddleware($cachedFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
}
|
|
|
|
public function testShouldSaveValueInCacheWithSpecifiedPrefix()
|
|
{
|
|
$prefix = 'test_prefix_';
|
|
$lifetime = '70707';
|
|
$cacheKey = 'myKey';
|
|
$token = '1/abcdef1234567890';
|
|
$authResult = ['access_token' => $token];
|
|
$this->mockCacheItem
|
|
->expects($this->any())
|
|
->method('get')
|
|
->will($this->returnValue(null));
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('set')
|
|
->with($this->equalTo($token))
|
|
->will($this->returnValue(false));
|
|
$this->mockCacheItem
|
|
->expects($this->once())
|
|
->method('expiresAfter')
|
|
->with($this->equalTo($lifetime));
|
|
$this->mockCache
|
|
->expects($this->any())
|
|
->method('getItem')
|
|
->with($this->equalTo($prefix . $cacheKey))
|
|
->will($this->returnValue($this->mockCacheItem));
|
|
$this->mockFetcher
|
|
->expects($this->any())
|
|
->method('getCacheKey')
|
|
->will($this->returnValue($cacheKey));
|
|
$this->mockFetcher
|
|
->expects($this->once())
|
|
->method('fetchAuthToken')
|
|
->will($this->returnValue($authResult));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->with('authorization', 'Bearer ' . $token)
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
// Run the test.
|
|
$cachedFetcher = new FetchAuthTokenCache(
|
|
$this->mockFetcher,
|
|
['prefix' => $prefix, 'lifetime' => $lifetime],
|
|
$this->mockCache
|
|
);
|
|
$middleware = new AuthTokenMiddleware($cachedFetcher);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
}
|
|
|
|
/** @dataProvider provideShouldNotifyTokenCallback */
|
|
public function testShouldNotifyTokenCallback(callable $tokenCallback)
|
|
{
|
|
$prefix = 'test_prefix_';
|
|
$cacheKey = 'myKey';
|
|
$token = '1/abcdef1234567890';
|
|
$authResult = ['access_token' => $token];
|
|
$this->mockCacheItem
|
|
->expects($this->any())
|
|
->method('get')
|
|
->will($this->returnValue(null));
|
|
$this->mockCache
|
|
->expects($this->any())
|
|
->method('getItem')
|
|
->with($this->equalTo($prefix . $cacheKey))
|
|
->will($this->returnValue($this->mockCacheItem));
|
|
$this->mockFetcher
|
|
->expects($this->any())
|
|
->method('getCacheKey')
|
|
->will($this->returnValue($cacheKey));
|
|
$this->mockFetcher
|
|
->expects($this->once())
|
|
->method('fetchAuthToken')
|
|
->will($this->returnValue($authResult));
|
|
$this->mockRequest
|
|
->expects($this->once())
|
|
->method('withHeader')
|
|
->will($this->returnValue($this->mockRequest));
|
|
|
|
MiddlewareCallback::$expectedKey = $this->getValidKeyName($prefix . $cacheKey);
|
|
MiddlewareCallback::$expectedValue = $token;
|
|
MiddlewareCallback::$called = false;
|
|
|
|
// Run the test.
|
|
$cachedFetcher = new FetchAuthTokenCache(
|
|
$this->mockFetcher,
|
|
['prefix' => $prefix],
|
|
$this->mockCache
|
|
);
|
|
$middleware = new AuthTokenMiddleware(
|
|
$cachedFetcher,
|
|
null,
|
|
$tokenCallback
|
|
);
|
|
$mock = new MockHandler([new Response(200)]);
|
|
$callable = $middleware($mock);
|
|
$callable($this->mockRequest, ['auth' => 'google_auth']);
|
|
$this->assertTrue(MiddlewareCallback::$called);
|
|
}
|
|
|
|
public function provideShouldNotifyTokenCallback()
|
|
{
|
|
MiddlewareCallback::$phpunit = $this;
|
|
$anonymousFunc = function ($key, $value) {
|
|
MiddlewareCallback::staticInvoke($key, $value);
|
|
};
|
|
return [
|
|
['Google\Auth\Tests\MiddlewareCallbackFunction'],
|
|
['Google\Auth\Tests\MiddlewareCallback::staticInvoke'],
|
|
[['Google\Auth\Tests\MiddlewareCallback', 'staticInvoke']],
|
|
[$anonymousFunc],
|
|
[[new MiddlewareCallback, 'staticInvoke']],
|
|
[[new MiddlewareCallback, 'methodInvoke']],
|
|
[new MiddlewareCallback],
|
|
];
|
|
}
|
|
}
|
|
|
|
class MiddlewareCallback
|
|
{
|
|
public static $phpunit;
|
|
public static $expectedKey;
|
|
public static $expectedValue;
|
|
public static $called = false;
|
|
|
|
public function __invoke($key, $value)
|
|
{
|
|
self::$phpunit->assertEquals(self::$expectedKey, $key);
|
|
self::$phpunit->assertEquals(self::$expectedValue, $value);
|
|
self::$called = true;
|
|
}
|
|
|
|
public function methodInvoke($key, $value)
|
|
{
|
|
return $this($key, $value);
|
|
}
|
|
|
|
public static function staticInvoke($key, $value)
|
|
{
|
|
$instance = new self();
|
|
return $instance($key, $value);
|
|
}
|
|
}
|
|
|
|
function MiddlewareCallbackFunction($key, $value)
|
|
{
|
|
return MiddlewareCallback::staticInvoke($key, $value);
|
|
}
|