1818use App \Helpers \FailureHelper ;
1919use Nette \Utils \Arrays ;
2020use Nette \Http \IResponse ;
21+ use Tracy \ILogger ;
2122use Firebase \JWT \JWT ;
2223use Firebase \JWT \Key ;
2324use 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}
0 commit comments