#angular #symfony #oauth #authorization #battlenet-api
#angular #symfony #oauth #авторизация #battlenet-api
Вопрос:
На самом деле, у меня есть веб-приложение с разделенными интерфейсными (Angular 7) и серверными (Symfony 4.2) средами. Пользователи подключены с помощью Google OAuth2. Я хотел бы разрешить пользователям связывать свою учетную запись игровых платформ (например Battle.net , Steam, XBOX …) к их учетной записи веб-приложения (например, Discord Connections). Для этого я использовал поток кода авторизации (https://develop.battle.net/documentation/guides/using-oauth/authorization-code-flow). Я не понимаю рабочий процесс для достижения этого, должен ли я перенаправить пользователя с интерфейса непосредственно на страницу авторизации и перенаправить на API? Но если я это сделаю, как я могу получить токен доступа из интерфейсной части?
На самом деле, пользователь нажимает на кнопку во внешнем интерфейсе приложения, оно перенаправляет его на внутренний маршрут, который создает URL-адрес oauth (с такими параметрами, как client_id, redirect_uri …), А затем перенаправляет на страницу авторизации.
После аутентификации пользователя на Battle.net платформа, она перенаправляет пользователя на обратный вызов сервера с кодом, но я не знаю, что с этим делать, как перенаправить или обновить интерфейс после этого действия?
Интерфейс :
<a href="{{ battleNetConnection }}" target="_blank" class="btn">Link your account</a>
<div class="container">
<p *ngIf="!battleNet.account">You need to link your battle.net account first.</p>
<!-- I need to update this part after the user have linked his account. -->
<p *ngIf="battleNet.account">{{ battleNet.account.btag }}</p>
</div>
import { Component, OnInit } from '@angular/core';
import { environment } from '../../../../environments/environment';
@Component({
selector: 'app-manage-platforms',
templateUrl: './manage-platforms.component.html',
styleUrls: ['./manage-platforms.component.scss']
})
export class ManagePlatformsComponent implements OnInit {
public battleNetConnection = `${environment.api.url}/connections/battlenet`;
constructor() {
}
ngOnInit() {}
}
Серверная часть :
Контроллер :
class BattleNetController extends AbstractController
{
/** @var BattleNetHttpClient $battleNetHttpClient */
private $battleNetHttpClient;
/**
* @param BattleNetHttpClient $battleNetHttpClient
*/
public function __construct(BattleNetHttpClient $battleNetHttpClient)
{
$this->battleNetHttpClient = $battleNetHttpClient;
}
/**
* @Route("/connections/battlenet", name = "connections_battlenet")
*
* @return SymfonyComponentHttpFoundationRedirectResponse
*/
public function authorize()
{
return $this->redirect($this->battleNetHttpClient->getAuthorizationUrl());
}
/**
* @Route("/connections/battlenet/callback", name = "connections_battlenet_callback")
*
* @param Request $request
*/
public function callback(Request $request)
{
$code = $request->get('code');
// What am I supposed to do there ?
}
}
Обслуживание :
class BattleNetHttpClient extends AbstractHttpClient
{
const BASE_URI = 'https://eu.battle.net';
const AUTH_ENDPOINT = '/oauth/authorize';
/** @var array $config */
private $config;
/**
* @param array $config
* @param HttpClient $httpClient
* @param RequestStack $requestStack
*/
public function __construct(array $config, HttpClient $httpClient, RequestStack $requestStack)
{
parent::__construct($httpClient, $requestStack);
$this->config = $config;
}
/** {@inheritdoc} */
public function getAuthorizationUrl()
{
$params = http_build_query([
'client_id' => $this->config['client_id'],
'redirect_uri' => $this->getBaseUrl() . '/connections/battlenet/callback',
'response_type' => 'code',
]);
$url = self::BASE_URI . self::AUTH_ENDPOINT . '?' . $params;
return $url;
}
}
Я хотел бы получить информацию о пользователе (например, имя пользователя, если он действительно зарегистрирован на этой платформе …) на связанной платформе после входа в систему, а затем получить access_token из API платформ, чтобы разрешить запросы к ним.