Lumenで堅牢なAPIを設計する。

 Lumenで堅牢なAPIを設計する。

PHPerkaigi2018のLTで発表した内容です。
https://phperkaigi.jp/2018/proposal/c4c6998a-6433-4c5b-aa82-d13d4a03a023

F2ab92715fdcc539883d13af4b804ec1?s=128

Futoshi Endo

March 10, 2018
Tweet

Transcript

  1. ԕ౻ଠಙ(.01FQBCP *OD 1)1FS,BJHJ -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δ

  2. ԕ౻ଠಙ ͑ΜͲ͎ʔ !'FOEP 4)ࣄۀ෦άʔϖ8FCΤϯδχΞ

  3. ୭ -BSBWFMͷνϡʔτϦΞϧΛ࡞ͬͯΈͨɻ ςετۦಈ։ൃೖ໳

  4. ࿩͞ͳ͍ࣄ͓࿳ͼ

  5. ςετͷ࿩

  6. ςετͷ࿩ ઃܭͷ࿩

  7. None
  8. ςετͷ࿩ ઃܭͷ࿩ 3&45GVMͷ࿩

  9. None
  10. ʮ8FC"1*(PPE1BSUTʯ Λಡ΋͏

  11. ݎ࿚ͱ͸

  12. ݎ࿚ͱ͸ 8FC"1*Ͱ͸௨ৗͷ΢ΣϒΞϓϦέʔγϣϯͱಉ༷ʹ)551Λ௨͡ ͯެ։͞ΕαʔϏεͰ͔͢Βɺಉ༷ʹ҆ఆੑ΍ηΩϡϦςΟ͕ཁٻ ͞Ε·͢ɻ l8FC"1*5IF(PPE1BSUTୈষΑΓ Q z

  13. ηΩϡΞͰ҆ఆͨ͠"1*Λߏங͢Δ

  14. ݎ࿚ͳ"1*Λઃܭ͢Δ 3FRVFTU Middleware 3PVUF $POUSPMMFS "QQMJDBUJPO .PEFM 3FTQPOT

  15. ݎ࿚ͳ"1*Λઃܭ͢Δ ɾ08"414FDVSF)FBEFSTͷઃఆ ɾϒϥ΢βܦ༝Ͱͷ"1*ΞΫηεʹΑΔ߈ܸରࡦ ɾ5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ɾ%P4߈ܸରࡦ wϥΠϒϥϦΛ࢖ͬͨೝূ ɾKXUBVUI ࣌ؒͷ౎߹্঺հͰ͖ͳ͔ͬͨ෦෼-VNFOͰग़དྷΔηΩϡϦςʔରԠʹؔ͢Δ5JQT

  16. 08"414FDVSF)FBEFSTͷઃఆ

  17. 08"414FDVSF)FBEFSTͷઃఆ ΞϓϦέʔγϣϯͷηΩϡϦςΟΛڧԽ͢Δҝʹ࢖༻Ͱ͖Δ)551Ϩεϙϯεϔο μʔͷ஋Λ08"4"1͕ఆΊ͍ͯΔ஋ʹઃఆ͢ΔࣄͰ944΍+40/ϋΠδϟοΫͳ Ͳͷϒϥ΢β͔ΒͷΞΫηεΛ૝ఆͨ͠৔߹ͷ੬ऑੑΛར༻ͨ͠߈ܸʹ༗ޮͰ͢ɻ

  18. 08"414FDVSF)FBEFSTͷઃఆ .JEEMFXBSFʹ௥Ճ͢Δɻ

  19. CPPUTUSBQBQQQIQʹొ࿥͢Δɻ $app->routeMiddleware([ 'security' => App\Http\Middleware\SecurityHeaders::class, ]); SPVUFTXFCQIQͰݺͼग़͢ɻ $router->group(['prefix' => 'api',

    'middleware'=>'security'], function() use ($router){ $router->get('hoges', ['uses' => 'HogesController@showAllHoges']); }); 08"414FDVSF)FBEFSTͷઃఆ
  20. 5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ

  21. 5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ΞΫηεʹϨʔτϛϦοτΛ͔͚Δࣄ͕Ͱ͖Δ.JEEMFXBSFɻ %P4߈ܸͳͷͲͷେྔΞΫηεΛ๷͛Δɻ ˞-VNFOʹ͸ඪ४ͰඋΘͬͯͳ͍ͷͰɺ(JUIVC͔Β௚઀औಘͯ͠ -VNFO༻ʹΧελϚΠζ͢Δɻ ‘throttleɿ3,1’ 1෼ؒʹ3ճͷϦΫΤετΛڐՄ͢Δɻ ‘throttleɿ300,1’1෼ؒʹ300ճͷϦΫΤετΛڐՄ͢Δɻ

  22. 5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ 3PVUF XFCQIQ Ͱࢦఆ͢Δɻ $curl localhost:8010 {"status":429,"message":"Too Many Attempts."} ઃఆ਺Ҏ্ʹϦΫΤετ͢ΔͱͱΤϥʔϝοηʔδΛฦ͢

    $router->group(['middleware' => 'throttle:3,1'], function () use ($router) { $router->get('/', function () use ($router) { return view('index'); }); });
  23. ϥΠϒϥϦΛ࢖ͬͨೝূ

  24. ϥΠϒϥϦΛ࢖ͬͨೝূ ϥΠϒϥϦແ͠Ͱͷ-VNFOͰͷೝূ͸ਏ͍ʜ

  25. ϥΠϒϥϦΛ࢖ͬͨೝূ -VNFO͸-BSBWFMͷެࣜύοέʔδͰ͋Δ1BTTQPSU ೝূύοέʔδ Λ αϙʔτͯ͠ͳ͍ɻ ˞ඇެࣜͰͳΒଘࡏ͢Δ͕ෆ҆ఆ 0"VUIͳͲΛ࠷ॳ͔Β૊΋͏ͱ͢Δͱগ͠େมɻ ϥΠϒϥϦແ͠Ͱͷ-VNFOͰͷೝূ͸ਏ͍ʜ

  26. ϥΠϒϥϦΛ࢖ͬͨೝূ

  27. ͜Εͩ

  28. υΩϡϝϯτ͸Ͳͩ͜

  29. ϥΠϒϥϦΛ࢖ͬͨೝূ ৄࡉ(VJEFGPSTFUUJOHVQXJUI-VNFO 

  30. ϥΠϒϥϦΛ࢖ͬͨೝূ

  31. ಈ͔Ͷ͐

  32. -VNFOͷ৔߹͸KXUPBVUI !EFW PSMBUFTUΛΠϯετʔϧ͢Δ $composer require tymon/jwt-auth:"^1.0@dev" ϥΠϒϥϦΛ࢖ͬͨೝূ

  33. ಈ͍ͨ

  34. ͨͩʜ

  35. ϥΠϒϥϦΛ࢖ͬͨೝূ

  36. ϥΠϒϥϦΛ࢖ͬͨೝূ

  37. ϥΠϒϥϦΛ࢖ͬͨೝূ

  38. ҆ఆͯ͠ͳ͍ʜ

  39. ·ͱΊ

  40. ɾηΩϡϦςΟʔʹ͍ͭͯ༨Γ஌͕ࣝͳ͔͕ͬͨ .JEEMFXBF΍ϥΠϒϥϦʔΛ௥Ճ͢Ε͹ָʹରࡦ͕Ͱ͖Δ ·ͱΊ

  41. ɾηΩϡϦςΟʔʹ͍ͭͯ༨Γ஌͕ࣝͳ͔͕ͬͨ .JEEMFXBF΍ϥΠϒϥϦʔΛ௥Ճ͢Ε͹ָʹରࡦ͕Ͱ͖Δ ɾೝূपΓ͸-BSBWFMͱൺ΂Δͱ-VNFO͸ਏ͍ɻ ·ͱΊ

  42. ͓΍ ·ͱΊ

  43. ݎ࿚ͳ"1*Λઃܭ͢Δ ɾ08"414FDVSF)FBEFSTͷઃఆ ɾϒϥ΢βܦ༝Ͱͷ"1*ΞΫηεʹΑΔ߈ܸରࡦ ɾ5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ɾ%P4߈ܸରࡦ wϥΠϒϥϦΛ࢖ͬͨೝূ ɾKXUBVUI ࣌ؒͷ౎߹্঺հͰ͖ͳ͔ͬͨ෦෼-VNFOͰग़དྷΔηΩϡϦςʔରԠʹؔ͢Δ5JQT

  44. ݎ࿚ͳ"1*Λઃܭ͢Δ ɾ08"414FDVSF)FBEFSTͷઃఆ ɾϒϥ΢βܦ༝Ͱͷ"1*ΞΫηεʹΑΔ߈ܸରࡦ ɾ5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ɾ%P4߈ܸରࡦ wϥΠϒϥϦΛ࢖ͬͨೝূ ɾKXUBVUI ࣌ؒͷ౎߹্঺հͰ͖ͳ͔ͬͨ෦෼-VNFOͰग़དྷΔηΩϡϦςʔରԠʹؔ͢Δ5JQT ͦΕ-BSBWFMͰ΋Ͱ͖ΔΑ

  45. ݎ࿚ͳ"1*Λઃܭ͢Δ ɾ08"414FDVSF)FBEFSTͷઃఆ ɾϒϥ΢βܦ༝Ͱͷ"1*ΞΫηεʹΑΔ߈ܸରࡦ ɾ5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ɾ%P4߈ܸରࡦ wϥΠϒϥϦΛ࢖ͬͨೝূ ɾKXUBVUI ࣌ؒͷ౎߹্঺հͰ͖ͳ͔ͬͨ෦෼-VNFOͰग़དྷΔηΩϡϦςʔରԠʹؔ͢Δ5JQT ͦΕ-BSBWFMͰ ඪ४Ͱ͋ΔΑ

    ͦΕ-BSBWFMͰ΋Ͱ͖ΔΑ
  46. ݎ࿚ͳ"1*Λઃܭ͢Δ ɾ08"414FDVSF)FBEFSTͷઃఆ ɾϒϥ΢βܦ༝Ͱͷ"1*ΞΫηεʹΑΔ߈ܸରࡦ ɾ5ISPUUMFΛ࢖ͬͨΞΫηε੍ݶͷઃఆ ɾ%P4߈ܸରࡦ wϥΠϒϥϦΛ࢖ͬͨೝূ ɾKXUBVUI ࣌ؒͷ౎߹্঺հͰ͖ͳ͔ͬͨ෦෼-VNFOͰग़དྷΔηΩϡϦςʔରԠʹؔ͢Δ5JQT ͦΕ-BSBWFMͰ ඪ४Ͱ͋ΔΑ

    ͦΕ-BSBWFMͷ
 1BTTQPSUศརͩΑʂ ͦΕ-BSBWFMͰ΋Ͱ͖ΔΑ
  47. ·ͱΊ ͋

  48. ԕ౻ଠಙ(.01FQBCP *OD 1)1FS,BJHJ -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δ

  49. ԕ౻ଠಙ(.01FQBCP *OD 1)1FS,BJHJ -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δ

  50. ԕ౻ଠಙ(.01FQBCP *OD 1)1FS,BJHJ -VNFOͰݎ࿚ͳ"1*Λઃܭ͢Δ -BSBWFMͳΒΑΓݎ࿚ͳ"1*ΛઃܭͰ͖Δ

  51. None
  52. ·ͱΊ -BSBWFMͰݎ࿚ͳ"1*Λ࡞Ζ͏

  53. ͦΕͰ΋-VNFOͰݎ࿚ͳ"1*Λ࡞Γ͍ͨํ΁ -VNFOͰग़དྷΔηΩϡϦςΟରࡦʹؔ͢Δ5JQT

  54. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ ϓϩϑΟʔϧGFOEP1SPpMF