Ich stieß auch auf dieses Problem in Laravel 5.5
beim Erstellen benutzerdefinierte oAuth Provider. Nach langer Forschung erreichte ich, indem ich Gewohnheit MySocialServiceProvider
Klasse kreiere, die durch Laravel\Socialite\SocialiteServiceProvider
verlängert werden muss. Bitte gehen Sie durch den folgenden Code und Setup mit der entsprechenden Konfiguration, sicherlich wird es funktionieren.
Meine Verzeichnisstruktur wie folgt im Bild
MySocialServiceProvider.php
<?php
namespace App\Providers;
use Laravel\Socialite\SocialiteServiceProvider;
class MySocialServiceProvider extends SocialiteServiceProvider
{
public function register()
{
$this->app->bind('Laravel\Socialite\Contracts\Factory', function ($app) {
return new MySocialManager($app);
});
}
}
Wir haben eine Manger-Klasse erstellen, die wie folgt
MySocialManager enthalten .php
<?php
namespace App\Providers;
use App\Auth\SocialiteFooDriver;
use Laravel\Socialite\SocialiteManager;
class MySocialManager extends SocialiteManager
{
protected function createFooDriver()
{
$config = $this->app['config']['services.foo'];
return $this->buildProvider(
SocialiteFooDriver::class, $config
);
}
}
Wir sollten einen benutzerdefinierten Treiber, die SocialiteFooDriver.php von MySocialManger
verwendet erstellen
<?php
namespace App\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
class SocialiteFooDriver extends AbstractProvider implements ProviderInterface
{
/**
* Foo API endpoint.
*
* @var string
*/
// protected $apiUrl = 'https://auth.foobar.com';
protected $apiUrl = '';
public function __construct(Request $request, $clientId, $clientSecret, $redirectUrl)
{
parent::__construct($request, $clientId, $clientSecret, $redirectUrl);
$this->apiUrl = config('services.foo.url');
}
/**
* The scopes being requested.
*
* @var array
*/
protected $scopes = ['openid email profile user_role user_full_name'];
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase($this->apiUrl.'/oauth2/authorize', $state);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl()
{
return $this->apiUrl.'/oauth2/token';
}
/**
* {@inheritdoc}
*/
protected function getUserByToken($token)
{
$userUrl = $this->apiUrl.'/oauth2/UserInfo?access_token='.$token;
$response = $this->getHttpClient()->get(
$userUrl, $this->getRequestOptions()
);
$user = json_decode($response->getBody(), true);
if (in_array('user:email', $this->scopes)) {
$user['email'] = $this->getEmailByToken($token);
}
return $user;
}
/**
* Get the POST fields for the token request.
*
* @param string $code
*
* @return array
*/
protected function getTokenFields($code)
{
return array_add(
parent::getTokenFields($code), 'grant_type', 'authorization_code'
);
}
/**
* {@inheritdoc}
*/
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => $user['sub'],
'nickname' => $user['preferred_username'],
'name' => Arr::get($user, 'name'),
'email' => Arr::get($user, 'email'),
'avatar' => $user['avatar'],
]);
}
/**
* Get the default options for an HTTP request.
*
* @return array
*/
protected function getRequestOptions()
{
return [
'headers' => [
//'Accept' => 'application/vnd.github.v3+json',
],
];
}
}
Schließlich sollten wir Config-Werte in config/services.php
'foo' => [
'client_id' => 'XXXXXXXX',
'client_secret' => 'YYYYYYYY',
'redirect' => 'http://example.com/login/foo/callback/',
'url' => 'https://auth.foobar.com',
],
hinzufügen haben
Vergessen Sie nicht, config/app.php mit unserem neuen Anbieter
'providers' => [
//...
\App\Providers\MySocialServiceProvider::class
]
jetzt bekomme ich „Klasse Socialite existiert nicht“ –
hast du 'Komponist dump-autoload' ?? – Drudge
ja, ich tat, aber immer noch nicht funktioniert –