morgann/oauth2-mixer

league/oauth2-client的Mixer提供程序

1.0.1 2020-08-06 12:03 UTC

This package is auto-updated.

Last update: 2024-09-04 22:04:36 UTC


README

pipeline status coverage report

这是一个集成Mixer身份验证与OAuth2客户端库的包,由The League of Extraordinary Packages提供。

安装

要安装,请使用composer

composer require morgann/oauth2-mixer

用法

用法与league的OAuth客户端相同,使用\Morgann\OAuth2\Client\Mixer\Provider\Mixer作为提供程序。例如

$provider = new \Morgann\OAuth2\Client\Mixer\Provider\Mixer([
    'clientId' => "YOUR_CLIENT_ID",
    'clientSecret' => "YOUR_CLIENT_SECRET",
    'redirectUri' => "http://your-redirect-uri"
]);

您还可以选择性地向构造函数传递的数组中添加一个scopes键。可用的范围在Mixer API文档中有记录。

注意:默认情况下,提供程序使用"user:details:self"范围。如果您传递其他范围,并且希望"->getResourceOwner()"方法正常工作,您需要确保使用"user:details:self"范围。

if (isset($_GET['code']) && $_GET['code']) {
    $token = $this->provider->getAccessToken("authorization_code", [
        'code' => $_GET['code']
    ]);

    // Returns an instance of Morgann\OAuth2\Client\Mixer\Entity\MixerUser
    $user = $this->provider->getResourceOwner($token);
    
    $user->getId();
    $user->getAvatar()
    $user->getBio();
    $user->getCreatedAt();
    $user->getEmail();
    $user->getExperience();
    $user->getLevel();
    $user->getName();

Symfony框架集成

有关添加提供程序的完整文档,请参阅KnpUOAuth2ClientBundle

步骤1 - 配置提供程序

将Mixer添加到提供程序列表中

# config/packages/knpu_oauth2_client.yaml
knpu_oauth2_client:
  clients:
    # ...
    mixer:
      type: generic
      provider_class: Morgann\OAuth2\Client\Mixer\Provider\Mixer
      client_id: '%env(resolve:OAUTH_MIXER_ID)%'
      client_secret: '%env(resolve:OAUTH_MIXER_SECRET)%'
      redirect_route: connect_mixer_check
      redirect_params: {}

在环境变量中添加您的凭据

OAUTH_MIXER_ID=XXXXXXXXXXX
OAUTH_MIXER_SECRET=XXXXXXXXXXX

步骤2 - 添加客户端控制器

创建Mixer身份验证器控制器

<?php

namespace App\Controller\Authenticator;

use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class MixerController extends AbstractController
{
    /**
     * Connect
     * @Route("/connect/mixer", name="connect_mixer")
     * @param \KnpU\OAuth2ClientBundle\Client\ClientRegistry $clientRegistry
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function connectAction(ClientRegistry $clientRegistry)
    {
        return $clientRegistry
            ->getClient('mixer')
            ->redirect();
    }

    /**
     * Connect check
     * @Route("/connect/mixer/check", name="connect_mixer_check")
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function connectCheckAction(Request $request)
    {
        if (!$this->getUser()) {
            return new JsonResponse(array('status' => false, 'message' => "User not found!"));
        } else {
            return $this->redirectToRoute('home');
        }
    }
}

步骤3 - 添加守卫身份验证器

现在创建Mixer身份验证器守卫

<?php

namespace App\Security\Authenticator;

use App\Entity\UserEntity;
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use KnpU\OAuth2ClientBundle\Security\Authenticator\SocialAuthenticator;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

class MixerAuthenticator extends SocialAuthenticator
{
    private $clientRegistry;
    private $em;
    private $router;
    private $encoder;

    /**
     * Constructor
     * @param \KnpU\OAuth2ClientBundle\Client\ClientRegistry $clientRegistry
     * @param \Doctrine\ORM\EntityManagerInterface $em
     * @param \Symfony\Component\Routing\RouterInterface $router
     * @param \Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface $encoder
     */
    public function __construct(ClientRegistry $clientRegistry, EntityManagerInterface $em, RouterInterface $router, UserPasswordEncoderInterface $encoder)
    {
        $this->clientRegistry = $clientRegistry;
        $this->em = $em;
        $this->router = $router;
        $this->encoder = $encoder;
    }

    /**
     * Supports
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \Symfony\Component\HttpFoundation\Request $request
     */
    public function supports(Request $request)
    {
        return $request->getPathInfo() == '/connect/mixer/check' && $request->isMethod('GET');
    }

    /**
     * Get credentials
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \League\OAuth2\Client\Token\AccessToken
     */
    public function getCredentials(Request $request)
    {
        return $this->fetchAccessToken($this->getMixerClient());
    }

    /**
     * Get user
     * @param array $credentials
     * @param \Symfony\Component\Security\Core\User\UserProviderInterface $userProvider
     * @return \App\Entity\UserEntity $user
     * @throws \Exception
     */
    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        $mixerUser = $this->getMixerClient()
            ->fetchUserFromToken($credentials);

        $email = $mixerUser->getEmail();

        $user = $this->em->getRepository('App:UserEntity')
            ->findOneBy(['email' => $email]);
        if (!$user) {
            $user = new UserEntity();
            $user->setEmail($mixerUser->getEmail());
            $user->setFullname($mixerUser->getName());
            $user->setPassword(
                $this->encoder->encodePassword(
                    $user,
                    base64_encode(random_bytes(10))
                )
            );
            $this->em->persist($user);
            $this->em->flush();
        }

        return $user;
    }

    /**
     * Get Mixer Client
     * @return \KnpU\OAuth2ClientBundle\Client\OAuth2Client
     */
    private function getMixerClient()
    {
        return $this->clientRegistry
            ->getClient('mixer');
    }

    /**
     * Returns a response that directs the user to authenticate
     * @param Request $request
     * @param \Symfony\Component\Security\Core\Exception\AuthenticationException $authException
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function start(Request $request, \Symfony\Component\Security\Core\Exception\AuthenticationException $authException = null)
    {
        return new RedirectResponse('/login');
    }

    /**
     * Called when authentication executed but failed
     * @param Request $request
     * @param \Symfony\Component\Security\Core\Exception\AuthenticationException $exception
     * @return \Symfony\Component\HttpFoundation\Response|null
     *
     * @todo Implement onAuthenticationFailure() method.
     */
    public function onAuthenticationFailure(Request $request, \Symfony\Component\Security\Core\Exception\AuthenticationException $exception)
    {
    }

    /**
     * Called when authentication executed and was successful
     * @param Request $request
     * @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token
     * @param string $providerKey
     * @return void
     *
     * @todo Implement onAuthenticationSuccess() method.
     */
    public function onAuthenticationSuccess(Request $request, \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token, $providerKey)
    {
    }
}

现在您可以在安全配置文件中注册您的身份验证器

security:
    # ...
    firewalls:
        # ...
        main:
            # ...
            guard:
                authenticators:
                    - App\Security\Authenticator\MixerAuthenticator

Laravel框架集成

如果需要,此包包括Laravel框架集成。只需在您的Laravel应用程序中正常要求它,并将服务提供程序Morgann\OAuth2\Client\Mixer\FrameworkIntegration\Laravel\MixerOAuth2ServiceProvider添加到您的config/app.php中。

接下来,使用php artisan vendor:publish发布配置,并在生成的config/morgann/oauth2-mixer/config.php文件中填写您的客户端详细信息。

这将注册Mixer提供程序的绑定在IoC容器中,因此您可以在控制器方法中简单地使用类型提示\Morgann\OAuth2\Client\Mixer\Provider\Mixer,它将返回一个配置正确的实例。(有关详细信息,请参阅)

测试

可以使用以下命令运行测试

composer phpunit

导航到/build/coverage/html/index.html以查看HTML覆盖率日志。

贡献

请参阅[CONTRIBUTING](CONTRIBUTING.md

致谢

许可协议

MIT许可证(MIT)。有关更多信息,请参阅许可文件