QrCodeController.php 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Http\Controllers;
  3. use Validator;
  4. use Zxing\QrReader;
  5. use OTPHP\TOTP;
  6. use OTPHP\Factory;
  7. use Assert\AssertionFailedException;
  8. use Illuminate\Http\File;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\Storage;
  11. class QrCodecontroller extends Controller
  12. {
  13. /**
  14. * Handle uploaded qr code image
  15. *
  16. * @param \Illuminate\Http\Request $request
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function decode(Request $request)
  20. {
  21. // input validation
  22. $messages = [
  23. 'qrcode.image' => 'Supported format are jpeg, png, bmp, gif, svg, or webp'
  24. ];
  25. $validator = Validator::make($request->all(), [
  26. 'qrcode' => 'required|image',
  27. ], $messages);
  28. if ($validator->fails()) {
  29. return response()->json(['error' => $validator->errors()], 400);
  30. }
  31. // qrcode analysis
  32. $path = $request->file('qrcode')->store('qrcodes');
  33. $qrcode = new QrReader(storage_path('app/' . $path));
  34. $uri = urldecode($qrcode->text());
  35. // delete uploaded file
  36. Storage::delete($path);
  37. // return the OTP object
  38. try {
  39. $otp = Factory::loadFromProvisioningUri($uri);
  40. if(!$otp->getIssuer()) {
  41. $otp->setIssuer($otp->getLabel());
  42. $otp->setLabel('');
  43. }
  44. // returned object
  45. $twofaccount = (object) array(
  46. 'service' => $otp->getIssuer(),
  47. 'account' => $otp->getLabel(),
  48. 'uri' => $uri,
  49. 'icon' => '',
  50. 'options' => $otp->getParameters()
  51. );
  52. return response()->json($twofaccount, 200);
  53. }
  54. catch (AssertionFailedException $exception) {
  55. return response()->json([
  56. 'error' => [
  57. 'qrcode' => 'No valid TOTP resource in this QR code'
  58. ]
  59. ], 400);
  60. }
  61. }
  62. }