У меня есть некоторые проблемы во время настройки входа в Laravel, мне нужно использовать пользовательский сервер OAuth 2, но с password
типом предоставления.Я уже пробовал Socialite, но я не могу использовать password
тип предоставления, но просто authorization_code
.Как я могу это сделать?
Мой сервер OAuth был создан с использованием Gluu.
Это мой пользовательский поставщик Socialite:
<?php
namespace App\Oauth;
use Socialite;
use SocialiteProviders\Manager\OAuth2\AbstractProvider;
use SocialiteProviders\Manager\OAuth2\User;
class CustomUserOAuthProvider extends AbstractProvider
{
const IDENTIFIER = 'CUSTOMUSEROAUTH';
/**
* {@inheritdoc}
*/
protected $scopes = [
//'address',
//'clientinfo',
//'email',
//'mobile_phone',
//'openid',
//'oxd',
//'permission',
//'phone',
'profile',
//'uma_protection',
//'uma_name'
];
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase(env('AUTHORIZE_URL'), $state);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl()
{
return env('TOKEN_URL');
}
/**
* {@inheritdoc}
*/
public function getAccessToken($code)
{
$response = $this->getHttpClient()->post($this->getTokenUrl(), [
'headers' => ['Authorization' => 'Bearer ' . base64_encode($this->clientId . ':' . $this->clientSecret)],
'body' => $this->getTokenFields($code),
]);
return $this->parseAccessToken($response->getBody());
}
/**
* {@inheritdoc}
*/
protected function getTokenFields($code)
{
return array_add(
parent::getTokenFields($code),
'grant_type',
'authorization_code'
);
}
/**
* {@inheritdoc}
*/
protected function getUserByToken($token)
{
$response = $this->getHttpClient()->get(env('USERINFO_URL') . '?access_token=' . $token);
$userId = json_decode($response->getBody(), true)['sub'];
$response = $this->getHttpClient()->get(env('USERS_URL') . '?filter=' . urlencode('id eq "' . $userId . '"'), [
'headers' => [
'Authorization' => 'Bearer ' . $token,
],
]);
return json_decode($response->getBody(), true);
}
/**
* {@inheritdoc}
*/
protected function formatScopes(array $scopes, $scopeSeparator)
{
return implode(',', $scopes);
}
/**
* {@inheritdoc}
*/
protected function mapUserToObject(array $user)
{
return (new User)->setRaw($user)->map([
'id' => $user['Resources'][0]['id'],
'nickname' => $user['Resources'][0]['userName'],
'name' => $user['Resources'][0]['displayName'],
'email' => $user['Resources'][0]['emails'][0]['value'],
'nation' => $user['Resources'][0]['urn:ietf:params:scim:schemas:extension:gluu:2.0:User']['nation'],
'dob' => $user['Resources'][0]['urn:ietf:params:scim:schemas:extension:gluu:2.0:User']['dob'][0],
'gender' => $user['Resources'][0]['urn:ietf:params:scim:schemas:extension:gluu:2.0:User']['g'],
'address' => $user['Resources'][0]['urn:ietf:params:scim:schemas:extension:gluu:2.0:User']['addr']
]);
}
public function retrieveById($identifier) {
return Socialite::driver('customuseroauth')->userFromToken($identifier);
}
}