php 接入单点

tsvico Lv5

工具站后台是极简风的登录系统,想着接入 passKey,看了一下挺复杂,还是先接入下局域网部署的 authelia

前置条件:服务器可以访问到 authelia

authelia 介绍及配置

Authelia 是一个开源身份验证和授权服务器和门户,它履行信息安全的身份和访问管理 (IAM) 角色,通过 Web 门户为您的应用程序提供多因素身份验证和单点登录 (SSO)。它充当常见反向代理的伴侣。

其以下特点是我选择它的重要原因:

  • 轻量级

    压缩容器大小小于 20 兆字节,并且观察到的内存使用量通常在 30 兆字节以下,它是最轻量级的解决方案之一

  • 速度超快 ⚡

    用 Go 和 React 编写,授权策略和许多其他后端任务仅在几毫秒内完成,100 毫秒的登录门户加载时间使其成为最快的解决方案之一。

Authelia 主要配置都在 yml 文件中,打开 yml 配置文件,在合适位置添加 client 配置,配置参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
##
## Identity Providers
##
identity_providers:

#
# OpenID Connect (Identity Provider)
#
# It's recommended you read the documentation before configuration of this section:
# https://www.authelia.com/c/oidc
oidc:
# The hmac_secret is used to sign OAuth2 tokens (authorization code, access tokens and refresh tokens).
# HMAC Secret can also be set using a secret: https://www.authelia.com/c/secrets
hmac_secret: 'abc123abc123abc'
...
## Clients is a list of known clients and their configuration.
clients:
- client_id: 'tool'
client_name: 'tool'
client_secret: '$pbkdf2-sha512$310000$c8p78n7pUMln0jzvd4aK4Q$JNRBzwAo0ek5qKn50cFzzvE9RXV88h1wJn5KGiHrD0YKtZaR/nCb2CJPOsKaPK0hjf.9yHxzQGZziziccp6Yng' # The digest of 'insecure_secret'.
public: false
authorization_policy: 'two_factor'
require_pkce: true
pkce_challenge_method: 'S256'
redirect_uris:
- 'https://服务器地址/oidc/oidc_login.php'
scopes:
- 'openid'
- 'profile'
- 'email'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'client_secret_basic'

登录页配置

在登陆页添加按钮,a 标签访问 oidc_login.php

大致如下

1
2
3
4
5
6
7
<div class="layui-form-item demo-login-other">
<span style="padding: 0 21px 0 6px;">
<a href="../oidc/oidc_login.php">
<i class="layui-icon layui-icon-auz" style="color: #3492ed;"></i>
</a>
</span>
</div>

php 后端代码

PHP 后端库使用的是 OpenID-Connect-PHP
按照文档,在项目根目录安装

1
composer require jumbojett/openid-connect-php

创建文件 oidc/oidc_login.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
// 启用session,以便登录成功后设置状态
session_start();
// 按照实际所在位置修改
require __DIR__ . '/../vendor/autoload.php';

use Jumbojett\OpenIDConnectClient;
use Jumbojett\OpenIDConnectClientException;

try {
// 初始化 OIDC 客户端
$oidc = new OpenIDConnectClient(
// OIDC 提供者 URL,Authelia服务所在地址
'https://auth.xxx.xxx',
// 从提供者控制台获得的 client_id
'tool',
// 从提供者控制台获得的 client_secret
'insecure_secret'
);
$oidc->setCodeChallengeMethod('S256');
// 回调 URL(当前php的地址),登陆成功后返回当前php
$oidc->setRedirectURL('http://xxx/oidc/oidc_login.php');
// 请求的用户信息
$oidc->addScope(['openid', 'email', 'profile']);

// 检查是否有 'code' 参数以确定是否是回调
if (isset($_GET['code'])) {
// 用户授权后,OIDC 提供程序会将用户重定向回此 URL,并带上授权码(code)
$oidc->authenticate();

// 获取用户信息
$name = $oidc->requestUserInfo('name');
$email = $oidc->requestUserInfo('email');

$user = ["nick" => $name, "email" => $email];
$_SESSION['user'] = $user;
// 在这里处理用户信息,可以将用户信息保存到数据库或创建会话等
echo "欢迎, $name! 邮箱是 $email.";

// 这里想跳到哪里按照实际填写
echo "<meta http-equiv='refresh' content='3; url=/' />";
} else {
// 如果没有授权码,启动 OIDC 认证流程
$oidc->authenticate();
}
} catch (OpenIDConnectClientException $e) {
// 捕获并显示 OIDC 认证过程中的异常
echo "登录出错: " . $e->getMessage();

echo "<a href='/login'>返回</a>";
}

总结

整体流程还是很简单的,接下来看看 passkey 的接入

%% Example of sequence diagram
 sequenceDiagram;
  用户->>oidc_login.php : 请求
  oidc_login.php->>Authelia : 组成参数302跳转Authelia
  Authelia->> oidc_login.php: 携带结果返回
  oidc_login.php->>Authelia : 获取用户信息
  • 标题: php 接入单点
  • 作者: tsvico
  • 创建于 : 2024-08-17 19:36:23
  • 更新于 : 2024-08-17 21:45:32
  • 链接: https://blog.tbox.fun/2024/4120651335.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论