Skip to main content

PHP

配置Authok

获取应用密钥

你需要如下信息

  • Domain
  • Client ID
  • Client Secret

配置回调URL

配置 Logout URL

集成 AuthOK 到 PHP 应用

在工程目录运行如下命令:

composer require guzzlehttp/guzzle guzzlehttp/psr7 http-interop/http-factory-guzzle

安装 AuthOK PHP SDK

composer require authok/authok-php

会在工程根目录下创建一个vendor目录并下载所有 AuthOK SDK 及相关依赖. 同时会创建一个vendor/autoload.php文件.

配置SDK

在工程根目录创建一个.env文件:

# AuthOK 应用的 Client ID
AUTHOK_CLIENT_ID=YOUR_CLIENT_ID

# AuthOK 租户域名
AUTHOK_DOMAIN=YOUR_DOMAIN

# AuthOK 应用的 Client Secret
AUTHOK_CLIENT_SECRET=YOUR_CLIENT_SECRET

# A long, secret value used to encrypt the session cookie.
# This can be generated using `openssl rand -hex 32` from your shell.
AUTHOK_COOKIE_SECRET=

# A url your application is accessible from. Update this as appropriate.
AUTHOK_BASE_URL=http://127.0.0.1:3000

安装phpdotenv用于读取.env文件:

composer require vlucas/phpdotenv

接下来,创建一个index.php, 用于配置 AuthOK PHP SDK:

<?php

// Import the Composer Autoloader to make the SDK classes accessible:
require 'vendor/autoload.php';

// Load our environment variables from the .env file:
(Dotenv\Dotenv::createImmutable(__DIR__))->load();

// Now instantiate the AuthOK class with our configuration:
$authok = new \Authok\SDK\Authok([
'domain' => $_ENV['AUTHOK_DOMAIN'],
'clientId' => $_ENV['AUTHOK_CLIENT_ID'],
'clientSecret' => $_ENV['AUTHOK_CLIENT_SECRET'],
'cookieSecret' => $_ENV['AUTHOK_COOKIE_SECRET']
]);

设置应用路由

composer require steampixel/simple-php-router

接下来在index.php中导入路由库:

// 👆 We're continuing from the steps above. Append this to your index.php file.
// Import our router library:
use Steampixel\Route;

// Define route constants:
define('ROUTE_URL_INDEX', rtrim($_ENV['AUTHOK_BASE_URL'], '/'));
define('ROUTE_URL_LOGIN', ROUTE_URL_INDEX . '/login');
define('ROUTE_URL_CALLBACK', ROUTE_URL_INDEX . '/callback');
define('ROUTE_URL_LOGOUT', ROUTE_URL_INDEX . '/logout');

检查会话

AuthOK PHP SDK有一个方法 getCredentials 用于检查用户是否经过认证并返回用户详情.

// 把以下代码追加到 index.php 文件.

Route::add('/', function() use ($authok) {
$session = $authok->getCredentials();

if ($session === null) {
// 用户未登录.
echo '<p>Please <a href="/login">登录</a>.</p>';
return;
}

// 用户已登录.
echo '<pre>';
print_r($session->user);
echo '</pre>';

echo '<p>您现在可以 <a href="/logout">注销</a>.</p>';
});

可以通过user属性来访问用户信息.

$name = $session->user['name'] ?? $session->user['nickname'] ?? $session->user['email'] ?? '未知';

登录

创建一个/login路由, 会调用 AuthOK PHP SDK的login方法, 构建一个 AuthOK 的统一登录 URL, 并把用户进行重定向.

// 把以下代码追加到 index.php 文件.

Route::add('/login', function() use ($authok) {
// 最好每次在登录前都重置用户会话,以规避 "invalid state" 错误:
$authok->clear();

// 构建一个 AuthOK 的统一登录 URL, 并把用户进行重定向.
header("Location: " . $authok->login(ROUTE_URL_CALLBACK));
exit;
});

处理认证回调

添加一个回调路由/callback

// 把以下代码追加到 index.php 文件.

Route::add('/callback', function() use ($authok) {
// 完成认证流程:
$authok->exchange(ROUTE_URL_CALLBACK);

// 重定向用户到 / 路由, 以显示用户信息:
header("Location: " . ROUTE_URL_INDEX);
exit;
});

注销

// 把以下代码追加到 index.php 文件.

Route::add('/logout', function() use ($authok) {
// 清除用户的本地会话, 然后重定向用户到 AuthOK 的 logout 端点以清除 AuthOK 全局会话.
header("Location: " . $authok->logout(ROUTE_URL_INDEX));
exit;
});

运行应用

// 把以下代码追加到 index.php 文件.

Route::run('/');
php -S 127.0.0.1:3000 index.php