Files
wordpress-theme-aksrt/src/Auth/Service.php
T

159 lines
4.3 KiB
PHP

<?php
/**
* @package AKSRT
*/
namespace AKSRT\Auth;
defined('ABSPATH') || exit;
final class Service {
use ServicePart1a;
use ServicePart1b;
public const EMAIL_VERIFIED_META = 'aksrt_email_verified';
public static function get_oauth_bind_context(string $obk): ?array {
$obk = sanitize_text_field($obk);
if ($obk === '') {
return null;
}
$row = OAuthTransactionStore::peek($obk, 'obk');
$data = is_array($row['payload'] ?? null) ? $row['payload'] : null;
return is_array($data) ? $data : null;
}
public static function claim_oauth_bind_context(string $obk): ?array {
$obk = sanitize_text_field($obk);
$row = $obk !== '' ? OAuthTransactionStore::claim($obk, 'obk') : null;
$data = is_array($row['payload'] ?? null) ? $row['payload'] : null;
if (!is_array($data)) {
return null;
}
$data['_oauth_claimed'] = true;
return $data;
}
public static function get_oauth_provider_name(string $provider): string {
$provider = sanitize_key($provider);
return OAuthProviderCatalog::label($provider);
}
public static function resolve_email_to_username(string $login): string {
$login = trim($login);
if (
\AKSRT\Sms\SMS::is_phonenumber($login)
&& class_exists('\AKSRT\Settings\Settings')
&& \AKSRT\Settings\Settings::signin_phone_enabled()
) {
$users = get_users([
'meta_key' => 'phone_number',
'meta_value' => $login,
'number' => 1,
]);
if (!empty($users[0]) && $users[0] instanceof \WP_User) {
return $users[0]->user_login;
}
}
if (is_email($login)) {
$user = get_user_by('email', $login);
if ($user && !is_wp_error($user)) {
return $user->user_login;
}
}
return sanitize_user($login, true);
}
public static function friendly_login_error(string $raw_message): string {
$msg_lower = wp_strip_all_tags(strtolower($raw_message));
if (false !== strpos($msg_lower, 'incorrect password') || false !== strpos($msg_lower, '密码不正确')) {
return __('用户名或密码错误,请重新输入', 'aksrt');
}
if (
false !== strpos($msg_lower, 'invalid username') ||
false !== strpos($msg_lower, 'invalid email') ||
false !== strpos($msg_lower, '<strong>error</strong>: 该用户不存在')
) {
return __('账号不存在,请检查输入或先注册', 'aksrt');
}
if (
false !== strpos($msg_lower, 'empty_password') ||
false !== strpos($msg_lower, 'empty username') ||
false !== strpos($msg_lower, 'empty')
) {
return __('请填写用户名和密码', 'aksrt');
}
return sprintf(__('登录失败:%s', 'aksrt'), wp_strip_all_tags($raw_message));
}
public static function mark_verified_email(int $user_id): void {
self::mark_email_verified($user_id);
}
public static function validate_password(string $password, string $confirm = '') {
if ($password === '') {
return __('请输入密码', 'aksrt');
}
if (mb_strlen($password) < 6) {
return __('密码长度至少6位', 'aksrt');
}
if (mb_strlen($password) > 128) {
return __('密码过长,请控制在128位以内', 'aksrt');
}
if ($confirm !== '' && $password !== $confirm) {
return __('两次输入的密码不一致', 'aksrt');
}
return true;
}
public static function login_user(array $post): array {
$resolved_login = self::resolve_email_to_username((string) ($post['log'] ?? ''));
$creds = [
'user_login' => $resolved_login,
'user_password' => (string) ($post['pwd'] ?? ''),
'remember' => !empty($post['rememberme']),
];
$original_post = $_POST;
$_POST = array_merge($_POST, $post);
try {
$user = wp_signon($creds);
} finally {
$_POST = $original_post;
}
if (is_wp_error($user)) {
return ['success' => false, 'error' => self::friendly_login_error($user->get_error_message())];
}
// REST API 上下文中 wp_signon 可能无法正确设置 Cookie
// 手动调用 wp_set_auth_cookie 确保 Cookie 被设置
if (defined('REST_REQUEST') && REST_REQUEST) {
wp_set_auth_cookie($user->ID, !empty($post['rememberme']));
wp_set_current_user($user->ID);
}
$redirect = !empty($post['redirect_to']) ? wp_unslash((string) $post['redirect_to']) : home_url('/');
$redirect = wp_validate_redirect($redirect, home_url('/'));
return [
'success' => true,
'user' => $user,
'redirect' => $redirect,
];
}
}