Skip to content

Commit f7516da

Browse files
committed
Adding proper logging for external authentication.
1 parent 9c515f2 commit f7516da

File tree

2 files changed

+62
-10
lines changed

2 files changed

+62
-10
lines changed

app/helpers/ExternalLogin/ExternalServiceAuthenticator.php

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use App\Helpers\FailureHelper;
1919
use Nette\Utils\Arrays;
2020
use Nette\Http\IResponse;
21+
use Tracy\ILogger;
2122
use Firebase\JWT\JWT;
2223
use Firebase\JWT\Key;
2324
use DomainException;
@@ -46,6 +47,9 @@ class ExternalServiceAuthenticator
4647
/** @var FailureHelper */
4748
public $failureHelper;
4849

50+
/** @var ILogger|null */
51+
public $logger = null;
52+
4953
/**
5054
* @var array [ name => { jwtSecret, expiration } ]
5155
*/
@@ -67,13 +71,15 @@ public function __construct(
6771
Instances $instances,
6872
EmailVerificationHelper $emailVerificationHelper,
6973
FailureHelper $failureHelper,
74+
?ILogger $logger = null,
7075
) {
7176
$this->externalLogins = $externalLogins;
7277
$this->users = $users;
7378
$this->logins = $logins;
7479
$this->instances = $instances;
7580
$this->emailVerificationHelper = $emailVerificationHelper;
7681
$this->failureHelper = $failureHelper;
82+
$this->logger = $logger;
7783

7884
foreach ($authenticators as $auth) {
7985
if (!empty($auth['name'] && !empty($auth['jwtSecret']))) {
@@ -89,6 +95,18 @@ public function __construct(
8995
}
9096
}
9197

98+
private function log($level, $msg, ...$args)
99+
{
100+
if (!$this->logger) {
101+
return;
102+
}
103+
104+
if ($args) {
105+
$msg = sprintf($msg, ...$args);
106+
}
107+
$this->logger->log($msg, $level);
108+
}
109+
92110
/**
93111
* Verify that given authenticator exists.
94112
* @param string $name of the external authenticator
@@ -129,6 +147,15 @@ public function authenticate(string $authName, string $token, string $instanceId
129147
// try to match existing local user by email address
130148
if ($user === null) {
131149
$user = $this->tryConnect($authName, $userData);
150+
if ($user) {
151+
$this->log(
152+
ILogger::INFO,
153+
"User '%s' was paired with external ID='%s' (%s)",
154+
$user->getId(),
155+
$userData->getId(),
156+
$authName
157+
);
158+
}
132159
}
133160

134161
// try to register a new user
@@ -148,6 +175,13 @@ public function authenticate(string $authName, string $token, string $instanceId
148175
// connect the account to the login method
149176
$this->externalLogins->connect($authName, $user, $userData->getId());
150177
$this->emailVerificationHelper->process($user, true); // true = just created
178+
$this->log(
179+
ILogger::INFO,
180+
"User '%s' just registered via external auth '%s' (ID='%s')",
181+
$user->getId(),
182+
$authName,
183+
$userData->getId()
184+
);
151185
}
152186
}
153187

@@ -259,13 +293,23 @@ private function handleExtraIds(User $user, $decodedToken, array $allowedService
259293
return;
260294
}
261295

296+
$this->log(ILogger::DEBUG, "User '%s' got extra IDs: %s", $user->getId(), json_encode($decodedToken->extId));
297+
262298
foreach ($decodedToken->extId as $service => $eid) {
263299
if (!in_array($service, $allowedServices)) {
300+
$this->log(
301+
ILogger::DEBUG,
302+
"User '%s' got new [%s] ID='%s', but this auth service is not allowed",
303+
$user->getId(),
304+
$service,
305+
$eid
306+
);
307+
264308
continue; // skip services that are not allowed
265309
}
266310

267311
$extUser = $this->externalLogins->getUser($service, $eid);
268-
if ($extUser) {
312+
if ($extUser) { // a user with given ID exists
269313
if ($extUser->getId() !== $user->getId()) {
270314
// Identity crysis! ID belongs to another user...
271315
$this->failureHelper->report(
@@ -285,14 +329,26 @@ private function handleExtraIds(User $user, $decodedToken, array $allowedService
285329
}
286330

287331
$login = $this->externalLogins->findByUser($user, $service);
288-
if ($login->getExternalId() !== $eid) {
289-
// extra ID has changed (strange, but possible)
290-
$login->setExternalId($eid);
291-
$this->externalLogins->persist($login);
292-
continue;
332+
if ($login) { // a connected external login record for the auth service already exist
333+
if ($login->getExternalId() !== $eid) {
334+
// extra ID has changed (strange, but possible)
335+
$this->log(
336+
ILogger::INFO,
337+
"User '%s' got new [%s] ID='%s', but already had different ID='%s'",
338+
$user->getId(),
339+
$service,
340+
$eid,
341+
$login->getExternalId()
342+
);
343+
$login->setExternalId($eid);
344+
$this->externalLogins->persist($login);
345+
}
346+
347+
continue; // either already exist or was duly updated
293348
}
294349

295350
$this->externalLogins->connect($service, $user, $eid);
351+
$this->log(ILogger::INFO, "User '%s' got new extra ID='%s' [%s]", $user->getId(), $eid, $service);
296352
}
297353
}
298354
}

tests/Presenters/AssignmentSolversPresenter.phpt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,10 @@
22

33
$container = require_once __DIR__ . "/../bootstrap.php";
44

5-
use App\Helpers\BrokerProxy;
65
use App\V1Module\Presenters\AssignmentSolversPresenter;
7-
use App\Model\Entity\AssignmentSolver;
86
use App\Model\Repository\Assignments;
9-
use App\Model\Repository\AssignmentSolvers;
107
use Doctrine\ORM\EntityManagerInterface;
118
use Tester\Assert;
12-
use Tracy\ILogger;
139

1410
$_SERVER['REMOTE_ADDR'] = '127.0.0.1';
1511

0 commit comments

Comments
 (0)