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