Вход в Laravel с пользовательским oauth-сервером - PullRequest
0 голосов
/ 03 мая 2019

У меня есть некоторые проблемы во время настройки входа в 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);
    }
}
...