@@ -106,7 +106,7 @@ TODO the descriptions
106
106
107
107
## Example Code
108
108
109
- For a full working example of this repository please see [ the dedicated example repository] ( https://github.com/Samyoul/U2F-php-server-examples )
109
+ For a full working code example for this repository please see [ the dedicated example repository] ( https://github.com/Samyoul/U2F-php-server-examples )
110
110
111
111
You can also install it with the following:
112
112
@@ -255,19 +255,136 @@ try {
255
255
}
256
256
257
257
// Fictitious view.
258
- echo View:: make (' template/location/u2f-registration-result.html' , [ ' userMessage' => $userMessage] );
258
+ echo View:: make (' template/location/u2f-registration-result.html' , compact ( ' userMessage' ) );
259
259
` ` `
260
260
261
261
### Authentication Code
262
262
263
+ #### Authentication Step 1:
263
264
**Starting the authentication process:**
264
265
265
- We assume that user has successfully authenticated and has previously registered.
266
+ We assume that user has successfully authenticated and has previously registered to use FIDO U2F .
266
267
267
268
` ` ` php
268
269
< ? php
269
- // All the amazing authentication code
270
+
271
+ require (' vendor/autoload.php' );
272
+ use Samyoul\U2F ;
273
+
274
+ session_start ();
275
+
276
+ // Fictitious function representing getting the authenticated user object
277
+ $user = getAuthenticatedUser ();
278
+
279
+ // Fictitious function, get U2F registrations associated with the user
280
+ $registrations = $user- > U2FRegistrations ();
281
+
282
+ // This can be anything, but usually easier if you choose your applications domain and top level domain.
283
+ $appId = " yourdomain.tld" ;
284
+
285
+ // Call the U2F makeAuthentication method, passing in the user's registration(s) and the app ID
286
+ $authenticationRequest = U2F :: makeAuthentication ($registrations, $appId);
287
+
288
+ // Store the request for later
289
+ $_SESSION [' authenticationRequest' ] = $authenticationRequest;
290
+
291
+ // now pass the data to a fictitious view.
292
+ echo View:: make (' template/location/u2f-authentication.html' , compact (" authenticationRequest" ));
293
+ ` ` `
294
+
295
+ #### Registration Step 2:
296
+ **Client-side, Talking To The USB**
297
+
298
+ Non-AJAX client-side registration of U2F key token. AJAX can of course be used in your application, but it is easier to demonstrate a linear process without AJAX and callbacks.
299
+
300
+
301
+ ` ` ` html
302
+ < html>
303
+ < head>
304
+ < title> U2F Key Authentication< / title>
305
+ < / head>
306
+ < body>
307
+ < h1> U2F Authentication< / h1>
308
+ < h2> Please enter your FIDO U2F device into your computer' s USB port. Then confirm authentication on the device.</h2>
309
+
310
+ <div style="display:none;">
311
+ <form id="u2f_submission" method="post" action="auth/u2f-authentication/confirm">
312
+ <input id="u2f_authentication_response" name="authentication_response" value="" />
313
+ </form>
314
+ </div>
315
+
316
+ <script type="javascript" src="https://raw.githubusercontent.com/google/u2f-ref-code/master/u2f-gae-demo/war/js/u2f-api.js"></script>
317
+ <script>
318
+ setTimeout(function() {
319
+
320
+ // Magic JavaScript talking to your HID
321
+ u2f.sign(<?php echo $authenticationRequest; ?>, function(data) {
322
+
323
+ // Handle returning error data
324
+ if(data.errorCode && errorCode != 0) {
325
+ alert("Authentication failed with error: " + data.errorCode);
326
+ // Or handle the error however you' d like.
327
+
328
+ return ;
329
+ }
330
+
331
+ // On success process the data from USB device to send to the server
332
+ var authentication_response = JSON .stringify (data);
333
+
334
+ // Get the form items so we can send data back to the server
335
+ var form = document .getElementById (' u2f_submission' );
336
+ var response = document .getElementById (' u2f_authentication_response' );
337
+
338
+ // Fill and submit form.
339
+ response .value = JSON .stringify (authentication_response);
340
+ form .submit ();
341
+ });
342
+ }, 1000 );
343
+ </script >
344
+ </body >
345
+ </html >
346
+ ```
347
+
348
+ #### Authentication Step 3:
349
+ ** Validation**
270
350
351
+ This is the last stage of authentication. Validate the authentication response data against the original request data.
352
+
353
+ ``` php
354
+ <?php
355
+
356
+ require('vendor/autoload.php');
357
+ use Samyoul\U2F;
358
+
359
+ session_start();
360
+
361
+ // Fictitious function representing getting the authenticated user object
362
+ $user = authenticatedUser();
363
+
364
+ // Fictitious function, get U2F registrations associated with the user
365
+ $registrations = $user->U2FRegistrations();
366
+
367
+ try {
368
+
369
+ // Validate the authentication response against the registration request.
370
+ // The output are the credentials you need to store for U2F authentication.
371
+ $validatedAuthentication = U2F::authenticate(
372
+ $_SESSION['authenticationRequest'],
373
+ $registrations,
374
+ json_decode($_POST['u2f_authentication_response'])
375
+ );
376
+
377
+ // Fictitious function representing the updating of the U2F token count integer.
378
+ $user->updateU2FRegistrationCount($validatedAuthentication);
379
+
380
+ // Then let your user know what happened
381
+ $userMessage = "Success";
382
+ } catch( Exception $e ) {
383
+ $userMessage = "We had an error: ". $e->getMessage();
384
+ }
385
+
386
+ //Fictitious view.
387
+ echo View::make('template/location/u2f-authentication-result.html', compact('userMessage'));
271
388
```
272
389
273
390
## Frameworks
0 commit comments