trustport/sdk 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

trustport/sdk

最新稳定版本:v0.1.0

Composer 安装命令:

composer require trustport/sdk

包简介

Trustport — passkey-based phone verification. Server-side SDK for PHP.

README 文档

README

Server-side SDK for Trustport — phishing-resistant passkey verification for your existing login flow.

This SDK targets the embedded widget (Verify) mode. If you want the OAuth-based "Sign in with Trustport" flow instead, see the Trustport developer docs.

Install

composer require trustport/sdk

Requires PHP ≥ 7.4 with ext-curl and ext-json (both bundled with every distro of PHP).

No composer / shared hosting? Use the single-file drop-in instead — same API, no dependencies.

Quickstart

<?php
require __DIR__ . '/vendor/autoload.php';

use Trustport\Client;
use Trustport\TrustportException;

$tp = new Client(['apiKey' => getenv('TRUSTPORT_API_KEY')]);

// In your login handler, after the password check passes:
$session = $tp->startSession(['subject' => $user->username]);

// Send $session->sid to your frontend, KEEP $session->claimToken on the server.
$_SESSION['tp_sid']   = $session->sid;
$_SESSION['tp_claim'] = $session->claimToken;
echo json_encode(['trustport_sid' => $session->sid]);

// Later (after the widget reports onApproved):
$result = $tp->verifySession([
    'sid'        => $_SESSION['tp_sid'],
    'claimToken' => $_SESSION['tp_claim'],
]);

if ($result->ok) {
    // $result->subject is the verified user. Now upgrade your PHP session.
    $_SESSION['user_id'] = $userId;
}

Full example (vanilla PHP)

<?php
// /api/login.php
session_start();
require __DIR__ . '/vendor/autoload.php';

use Trustport\Client;
use Trustport\TrustportException;

header('Content-Type: application/json');

$in = json_decode(file_get_contents('php://input'), true) ?: [];
$user = $db->users->findByUsername($in['username'] ?? '');

if (!$user || !password_verify($in['password'] ?? '', $user['password_hash'])) {
    http_response_code(401);
    echo json_encode(['ok' => false]);
    exit;
}

$tp = new Client(['apiKey' => getenv('TRUSTPORT_API_KEY')]);
try {
    $session = $tp->startSession(['subject' => $user['username']]);
} catch (TrustportException $e) {
    http_response_code($e->errorCode === 'subject_not_enrolled' ? 403 : 500);
    echo json_encode(['ok' => false, 'error' => $e->errorCode]);
    exit;
}

$_SESSION['tp_pending'] = [
    'user_id'     => $user['id'],
    'subject'     => $user['username'],
    'sid'         => $session->sid,
    'claim_token' => $session->claimToken,
];
echo json_encode(['ok' => true, 'trustport_sid' => $session->sid]);
<?php
// /api/finalise.php
session_start();
require __DIR__ . '/vendor/autoload.php';

use Trustport\Client;

header('Content-Type: application/json');

if (empty($_SESSION['tp_pending'])) {
    http_response_code(401);
    echo json_encode(['ok' => false]);
    exit;
}
$p = $_SESSION['tp_pending'];

$tp = new Client(['apiKey' => getenv('TRUSTPORT_API_KEY')]);
$result = $tp->verifySession([
    'sid'        => $p['sid'],
    'claimToken' => $p['claim_token'],
]);

if (!$result->ok || $result->subject !== $p['subject']) {
    http_response_code(401);
    echo json_encode(['ok' => false, 'status' => $result->status]);
    exit;
}

$_SESSION['user_id'] = $p['user_id'];
unset($_SESSION['tp_pending']);
echo json_encode(['ok' => true]);

API reference

new Trustport\Client(array $options)

Option Type Default Notes
apiKey string Required. From Trustport admin → Integrations.
baseUrl string https://trustport.vospen.com For self-hosted instances.
timeoutSeconds int 10 Per-request timeout.

$tp->startSession(['subject' => $username]): VerifySession

Returns:

$session->sid           // string — give to the frontend / widget
$session->claimToken    // string — SERVER ONLY
$session->verifyUrl     // string
$session->qrUrl         // string
$session->expiresAt     // DateTimeImmutable

Throws TrustportException with:

  • errorCode = "subject_not_enrolled" (HTTP 404)
  • errorCode = "no_active_device" (HTTP 409)
  • errorCode = "invalid_api_key" (HTTP 401)

$tp->verifySession(['sid' => ..., 'claimToken' => ...]): VerifyResult

Single-use server-to-server confirmation.

Returns VerifyResult:

if ($result->ok) {
    $result->subject;        // string
    $result->userId;         // string
    $result->verifiedAt;     // DateTimeImmutable
} else {
    $result->status;         // "pending" | "expired" | "rejected" | "claimed"
}

Throws TrustportException for transport/auth errors.

Trustport\TrustportException

catch (TrustportException $e) {
    $e->httpStatus;   // int — HTTP status (0 = transport error)
    $e->errorCode;    // string — e.g. "subject_not_enrolled"
    $e->body;         // array|null — raw response body
    $e->getMessage(); // string
}

Security

  • Never expose claimToken to the browser. Keep it in $_SESSION or another server-side store.
  • Never expose apiKey to the browser. Load from environment.
  • Sessions auto-expire after 2 minutes.
  • verifySession is single-use — replay attempts return ['ok' => false, 'status' => 'claimed'].

Links

License

MIT

统计信息

  • 总下载量: 0
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 1
  • 点击次数: 3
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-05-12

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固