farit-slv/esia-connector

OpenID ESIA 身份验证

1.1.0 2024-02-08 18:49 UTC

This package is auto-updated.

Last update: 2024-09-08 20:08:39 UTC


README

描述

这是一个用于在 "国家服务" 站点上授权和获取数据的组件。

库基于 SbWereWolf/esia-connectorskiexx/esia-connector,将标准的 PHP 函数 file_get_contents 替换为 cURL

因此,对于任意文本的签名,不需要私有密钥(签名在 Web 服务上完成),因此配置对象不需要私有密钥和证书的路径。

作为外部签名者,可以使用 CryptoPro

注意!

库的主要目标是获取令牌。获取令牌后,您可以执行任何 API 请求。库仅提供获取数据的最基本请求。

安装

使用 composer

composer require farit-slv/esia-connector

使用示例

test.php 中的示例

准备工作

  • 部署 CryptoPro 网络签名服务
  • 相应地启动,默认参数,以便在地址 https://:3037/cryptopro/sign 处处理 POST 请求以签名任意文本,调用签名时的参数为 {"text": "$message"}(使用 JSON 格式)

如何启动

  • cd ./example/
  • php -S localhost:8000 test.php
  • 在浏览器中打开 localhost:8000
  • 点击链接 通过国家服务门户登录
  • 在国家服务门户上执行身份验证
  • 授权您的组织访问用户(国家服务)资料的数据
  • 将重定向到 localhost:8000
  • 页面上将显示从国家服务获取的数据

如何使用

获取授权链接的示例

<?php 
$config = new \Esia\ConfigWithoutKeyPair([
    'clientId' => 'U407501', /* Код вашей организации в ЕСИА */
    'redirectUrl' => 'https://:8000/',
    'portalUrl' => 'https://esia-portal1.test.gosuslugi.ru/',
    'scope' => [
        'fullname', /* Просмотр вашей фамилии, имени и отчества */
    ],
]);

$signer = new HttpSigner(
    'https://:3037/cryptopro/sign',
    [
        'Content-Type' => 'application/json',
        'accept' => '*/*',
    ],
    'POST',
);

$esia = new \Esia\OpenId($config);
$esia->setSigner($signer);

<a href="<?=$esia->buildUrl()?>">Войти через портал госуслуги</a>

在重定向到您的 redirectUrl 后,您将在 $_GET['code'] 中收到用于获取令牌的代码

获取令牌和用户信息的示例

$esia = new \Esia\OpenId($config);
$esia->setSigner(new \Esia\SignerPKCS7(
    $config->getCertPath(),
    $config->getPrivateKeyPath(),
    $config->getPrivateKeyPassword(),
    $config->getTmpPath()
));

// Вы можете использовать токен в дальнейшем вместе с oid 
$token = $esia->getToken($_GET['code']);

$personInfo = $esia->getPersonInfo();

配置

clientId - 您应用程序的 ID。

redirectUrl - 带有代码的响应将被重定向到的 URL。

portalUrl - 默认值:https://esia-portal1.test.gosuslugi.ru/。授权域名(仅域名)。

codeUrlPath - 默认值:aas/oauth2/ac。获取代码的 URL。

tokenUrlPath - 默认值:aas/oauth2/te。获取令牌的 URL。

scope - 默认值:fullname birthdate gender email mobile id_doc snils inn。向用户请求的权限。

privateKeyPath - 私有密钥的路径。

privateKeyPassword - 私有密钥的密码。

certPath - 证书的路径。

tmpPath - 进行签名的目录的路径(必须可写)。

令牌和 oid

令牌 - 您从 ESIA 获得的用于进一步交互的 jwt 令牌

oid - 令牌所有者的唯一标识符

如何获取 oid?

有两种方法

  1. oid 包含在 jwt 令牌中,通过解密它来获取
  2. 获取令牌后,oid 保存到 config 中,可以通过以下方式获取
$esia->getConfig()->getOid();

令牌的重用

此外,请在配置中指定令牌和标识符

$config->setToken($jwt);
$config->setOid($oid);