morgann / oauth2-mixer
league/oauth2-client的Mixer提供程序
Requires
- league/oauth2-client: 1.*|2.*
Requires (Dev)
- mockery/mockery: ~1.2
- phpunit/phpunit: ~8.3
- squizlabs/php_codesniffer: ~3.4
This package is auto-updated.
Last update: 2024-09-04 22:04:36 UTC
README
这是一个集成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)。有关更多信息,请参阅许可文件。