/** * Create and return an OAuth2Adapter instance. * * @param string|array $type * @param array $config * @param ServiceLocatorInterface $services * @return OAuth2Adapter * @throws ServiceNotCreatedException when missing details necessary to * create instance and/or dependencies. */ public static function factory($type, array $config, ServiceLocatorInterface $services) { if (!isset($config['storage']) || !is_array($config['storage'])) { throw new ServiceNotCreatedException('Missing storage details for OAuth2 server'); } return new OAuth2Adapter(OAuth2ServerFactory::factory($config['storage'], $services), $type); }
public function __invoke($services) { $config = $services->get('Config'); $oauth2Config = isset($config['zf-oauth2']) ? $config['zf-oauth2'] : array(); $mvcAuthConfig = isset($config['zf-mvc-auth']['authentication']['adapters']) ? $config['zf-mvc-auth']['authentication']['adapters'] : array(); $servers = (object) array('application' => null, 'api' => array()); return function ($type = null) use ($oauth2Config, $mvcAuthConfig, $services, $servers) { // Empty type == legacy configuration. if (empty($type)) { if ($servers->application) { return $servers->application; } $factory = new OAuth2ServerInstanceFactory($oauth2Config, $services); return $servers->application = $factory(); } if (isset($servers->api[$type])) { return $servers->api[$type]; } foreach ($mvcAuthConfig as $name => $adapterConfig) { if (! isset($adapterConfig['storage']['route'])) { // Not a zf-oauth2 config continue; } if ($type !== $adapterConfig['storage']['route']) { continue; } // Found! return $servers->api[$type] = OAuth2ServerFactory::factory( $adapterConfig['storage'], $services ); } // At this point, a $type was specified, but no matching adapter // was found. Attempt to pull a global OAuth2 instance; if none is // present, this will raise an exception anyways. if ($servers->application) { return $servers->application; } $factory = new OAuth2ServerInstanceFactory($oauth2Config, $services); return $servers->application = $factory(); }; }
/** * @dataProvider disableGrantType * @group 77 */ public function testServerCreatedHasDefaultGrantTypesAsDefinedByOAuth2Module($disable) { $options = $this->getOAuth2Options(); $options['zf-oauth2']['grant_types'][$disable] = false; $options['zf-oauth2']['storage_settings'] = ['client_table' => 'CLIENTS', 'code_table' => 'AUTHORIZATION_CODES', 'user_table' => 'USERS', 'refresh_token_table' => 'REFRESH_TOKENS', 'jwt_table' => 'JWT']; $services = new ServiceManager(); $services->setService('Config', $options); $config = ['adapter' => 'pdo', 'dsn' => 'sqlite::memory:']; $server = OAuth2ServerFactory::factory($config, $services); $this->assertInstanceOf('OAuth2\\Server', $server); $grantTypes = $server->getGrantTypes(); foreach ($options['zf-oauth2']['grant_types'] as $type => $enabled) { // jwt is hinted differently in OAuth2\Server if ($type === 'jwt') { $type = 'urn:ietf:params:oauth:grant-type:jwt-bearer'; } // If the grant type is not enabled, it should not be present in // the returned grant types. if (!$enabled) { $this->assertArrayNotHasKey($type, $grantTypes); continue; } // If it *is* enabled, it MUST be present. $this->assertArrayHasKey($type, $grantTypes); switch ($type) { case 'client_credentials': $class = 'OAuth2\\GrantType\\ClientCredentials'; break; case 'authorization_code': $class = 'OAuth2\\GrantType\\AuthorizationCode'; break; case 'password': $class = 'OAuth2\\GrantType\\UserCredentials'; break; case 'urn:ietf:params:oauth:grant-type:jwt-bearer': $class = 'OAuth2\\GrantType\\JwtBearer'; break; case 'refresh_token': $class = 'OAuth2\\GrantType\\RefreshToken'; break; default: $this->fail(sprintf('Unknown grant type: %s!', $type)); break; } // and have an instance of the appropriate class. $this->assertInstanceOf($class, $grantTypes[$type]); } // Now verify that storage settings are also merged in, which was the // original issue. $storage = $server->getStorage('scope'); $r = new ReflectionProperty($storage, 'config'); $r->setAccessible(true); $storageConfig = $r->getValue($storage); foreach ($options['zf-oauth2']['storage_settings'] as $key => $value) { $this->assertArrayHasKey($key, $storageConfig); $this->assertEquals($value, $storageConfig[$key]); } }
public function testCanCreateMongoAdapterBackedServer() { if (! class_exists('MongoDB')) { $this->markTestSkipped('Mongo extension is required for this test'); } $services = $this->mockConfig(new ServiceManager()); $config = array( 'adapter' => 'mongo', 'database' => 'zf-mvc-auth-test', ); $server = OAuth2ServerFactory::factory($config, $services); $this->assertInstanceOf('OAuth2\Server', $server); }