runet-id/api-client-bundle

This package is abandoned and no longer maintained. No replacement package was suggested.

RUNET-ID API Client Bundle

1.0.0 2017-02-22 11:22 UTC

README

Установка:

$ composer require runet-id/api-client-bundle:^1.0.0@alpha

Минимальная конфигурация

runet_id_api_client:
    container:
        default_credentials: default
        credentials:
            default:
                key:    demokey
                secret: demosecret

Описание

Центральный для бандла класс - RunetId\ApiClientBundle\ApiClientContainer. Он позволяет работать с несколькими ключами одновременно и поддерживает кеширование (по умолчанию включено файловое кеширование в стандартную папку симфони %kernel.cache_dir%/runet_id_api_client).

Через конфигурацию в разделе container:credentials можно указать несколько профилей. В default_credentials указывается имя профиля по умолчанию (обязательный параметр).

Также в контейнере через RunetId\ApiClientBundle\ApiClientContainer::setCurrentName($name) можно задать "текущий" профиль (например, при помощи RequestListener, если выбор профиля зависит от параметров запроса к приложению). Если текущий профиль не был задан, метод RunetId\ApiClientBundle\ApiClientContainer::getCurrent() возвращает профиль по умолчанию.

Рекомендуется всегда использовать метод RunetId\ApiClientBundle\ApiClientContainer::getCurrent(), так как это обеспечивает максимальную гибкость.

Алиасы для быстрого доступа к сервисам (рекомендуется)

services:
    api_container:  "@runet_id.api_client.container"

    api:
        class: RunetId\ApiClientBundle\ApiCacheableClient
        factory: [ "@api_container", getCurrent ]

# создаем глобальную переменную в twig
# для быстрого доступа к апи из шаблонов
twig:
    globals:
        api: "@api"

Пример настройки авторизации

Подключаем js:

<script src="{{ asset('bundles/runetidapiclient/js/runet_id_api_client.js') }}"></script>
<script>
    var runetIdApiClient = new RunetId;

    runetIdApiClient.init({
        apiKey: '{{ api.options.key }}',
        backUrl: '{{ url('auth.token') }}'
    });
</script>

Код кнопки для авторизации

<button onclick="runetIdApiClient.login(); return false;">
    Войти через &ndash;RUNET&mdash;&mdash;ID&ndash;
</button>

Пример контроллера

<?php

namespace AppBundle\Controller;

use RunetId\ApiClient\Exception\ApiException;
use RunetId\ApiClient\Model\User;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;

/**
 * @Route("/auth")
 */
class AuthController extends Controller
{
    /**
     * @Route("/token", name="auth.token")
     * @param Request $request
     * @return Response
     * @throws HttpException
     */
    public function tokenAction(Request $request)
    {
        $token = $request->query->get('token');

        try {
            // содержит все данные о пользователе, полученные с RunetId
            $apiUser = $this->get('api')->user()->auth($token);
        } catch (ApiException $e) {
            throw new HttpException(403, $e->getMessage());
        }

        // регистрируем пользователя на мероприятие со статусом "Участник"
        $this->get('api')->event()->register($apiUser->RunetId, User\Status::ROLE_PARTICIPANT);

        // здесь авторизуем пользователя средствами Symfony

        return new Response('
            <script>
                window.onunload = function () {
                    window.opener.location.reload();
                };
                setTimeout(window.close, 400);
            </script>
        ');
    }
}