Свяжите учетную запись Battle.net (и других игровых платформ) с приложением в разных средах - PullRequest
2 голосов
/ 01 апреля 2019

На самом деле у меня есть веб-приложение с разделенными средами внешнего интерфейса (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 \Symfony\Component\HttpFoundation\RedirectResponse
     */
    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 платформ, чтобы разрешить запросы к ним.

...