0, 'url' => '', 'pass' => 0, 'exclude' => '', 'mode' => 'auto', 'exp' => time() + self::TTL, 'jti' => wp_generate_password( 16, false, false ), ), $payload ); $json = wp_json_encode( $payload ); $b64 = rtrim( strtr( base64_encode( (string) $json ), '+/', '-_' ), '=' ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode -- URL-safe token transport, not obfuscation. return $b64 . '.' . hash_hmac( 'sha256', $b64, self::key() ); } /** * Verify a token; returns the payload or null. * * @param string $token Token. * @param string $key Key override (MU loader passes the stored option). */ public static function verify( string $token, string $key = '' ): ?array { $key = '' !== $key ? $key : (string) get_option( self::OPTION ); if ( strlen( $key ) < 32 || '' === $token || strlen( $token ) > 4096 || false === strpos( $token, '.' ) ) { return null; } list( $b64, $mac ) = explode( '.', $token, 2 ); if ( ! hash_equals( hash_hmac( 'sha256', $b64, $key ), $mac ) ) { return null; } $json = base64_decode( strtr( $b64, '-_', '+/' ), true ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode -- URL-safe token transport, not obfuscation. $payload = is_string( $json ) ? json_decode( $json, true ) : null; if ( ! is_array( $payload ) || empty( $payload['exp'] ) || (int) $payload['exp'] < time() || empty( $payload['jti'] ) || ! is_string( $payload['jti'] ) ) { return null; } return $payload; } }