RailsアプリにGraphQLを導入してみた話

Dc5157c1e1b11923f4cdd210ee27d4af?s=47 patorash
November 30, 2019

 RailsアプリにGraphQLを導入してみた話

会社で運用しているWebサービスにGraphQLを導入してみたので、その際に得られた知見を共有します。

Dc5157c1e1b11923f4cdd210ee27d4af?s=128

patorash

November 30, 2019
Tweet

Transcript

  1. 2.

    ໨࣍  ࣗݾ঺հ  3&45GVM"1*ͷ՝୊  (SBQI2-ͱ͸ʁ  σϞ 

    ։ൃͯ͠Έͯͷײ૝ B ϝϦοτ C σϝϦοτ D ޻෉ͨ͠ͱ͜Ζ E ϋϚͬͨϙΠϯτ  ·ͱΊ 2
  2. 7.

    3&45GVM"1*ͷ՝୊ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST

    7 ௨৴ճ਺͕ଟ͘ͳΓ͕ͪ ˞࡞Γํ࣍ୈͰ͸͋Δ͚ΕͲɺ3&45 ͳઃܭͰ͍͑͹ʜ { “id”: 1, “user_id”: 1, “article_id”: 1, “content”: “この分野は素人なのですが…略”, “created_at”: “2019-11-23 00:00:00”, } { “id”: 10, “user_id”: 5, “article_id”: 1, “content”: “わかるぅ~”, “created_at”: “2019-11-23 06:00:00”, }
  3. 8.

    3&45GVM"1*ͷ՝୊ BSUJDMFT BSUJDMFTDPNNFOUT BSUJDMFTDPNNFOUT VTFST BSUJDMFTDPNNFOUT VTFST ʜ BSUJDMFTDPNNFOUT VTFST

    8 ௨৴ྔଟ͘ͳΓ͕ͪ l ຊདྷ࢖͏ͷ͸ Ϣʔβ໊ͱϝʔϧΞυϨεͷΈ l ༨ܭͳ৘ใ·Ͱૹͬͯ͠·͏ { “id”: 1, “name”: “Yamada Taro”, “email”: “t-yamada@example.com”, “role_id”: 1, “battle_power”: 530000, “created_at”: “2019-11-22 00:00:00”, “updated_at”: “2019-11-30 00:00:00” } ෆཁʂ
  4. 11.

    (SBQI2-ͱ͸ʁ l 'BDFCPPL͕։ൃ͍ͯ͠Δ8FC"1*ͷͨΊͷن֨ l ΫΤϦݴޠͱεΩʔϚݴޠ͔Β੒Δ ˓ ΫΤϦݴޠ ˙ σʔλऔಘܥͷRVFSZ ˙

    σʔλߋ৽ܥͷNVUBUJPO ˙ Πϕϯτ௨஌ͷTVCTDSJQUJPO ˓ εΩʔϚݴޠ ˙ ࢓༷Λ໌ه͢ΔͨΊͷݴޠ ˔ ܕ෇͚ l (JU)VC"1*WͰ(SBQI2-Λ࠾༻ 11
  5. 13.

    (SBQI2-Λௐࠪ RVFSZ 13 l ΫϥΠΞϯτ͕ཉ͍͠ σʔλͷΈऔಘ l Ұ౓ͷ"1*ίʔϧͰશͯ औಘՄೳ l

    σʔλ݅਺͕ଟ͍৔߹͸ɺ ϦϨʔΛఆٛͯ͠ࢦఆ݅਺ຖ ʹऔಘ͢Δ͜ͱ΋Մೳ query { article(id: 1) { id title content status createdAt updatedAt comments { id content user { id name email } } } }
  6. 14.

    (SBQI2-Λௐࠪ NVUBUJPO 14 l σʔλߋ৽༻ΫΤϦ l ໭Γ஋͸RVFSZͱಉ༷ͷ ϑΥʔϚοτͰऔಘՄೳ mutation {

    creatArticle(input: { title: "タイトル", content: "内容", status: 1, userId: 1 }) { article { id title content status user { id name } } } }
  7. 15.
  8. 17.

    ։ൃΛͯ͠Έͯͷײ૝ʢϝϦοτʣ l εΩʔϚఆٛͱಉ࣌ʹ"1*υΩϡϝϯτ͕׬੒ ˓ ΫϥΠΞϯτଆͷ։ൃऀͱڞ༗ l ςετ͕༰қ ˓ εΩʔϚఆٛϑΝΠϧΛର৅ʹςετ ˓

    &&ͷςετͰ͸ͳ͍ͷͰߴ଎ l σʔλ͕ҰൃͰऔΕΔշײ ˓ σʔλऔಘʹΫϥΠΞϯτଆʹओಋݖ͕͋Δ l "1*ͷೖΓޱΛҰຊԽ ˓ HSBQIRMͷΈ 17
  9. 18.

    ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺϥΠϒϥϦͰղܾՄೳ ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸ϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 18
  10. 20.

    ։ൃͯ͠Έͯͷײ૝ʢσϝϦοτʣ l εΩʔϚఆٛ͢Δͷ͕େม ˓ ϝλϓϩάϥϛϯάՄೳ͕ͩɺεΩʔϚఆٛΛϝλϓϩ͍͍ͯ͠ͷ͔ʁ ͱ͍͏׉౻͕ʜ l / ໰୊͕ൃੜ͠΍͍͢ ˓

    ͨͩ͠ɺ3BJMTͳΒϥΠϒϥϦͰղܾՄೳ HSBQIRMCBUDI ˓ औಘՄೳͳ߲໨͕ಈత ˙ ΫϥΠΞϯτଆ͕ཉ͍͠σʔλΛܾఆ͢ΔͨΊ ˙ ࣄલʹϩʔυͰ͖ͳ͍ l Ωϟογϡͮ͠Β͍ ˓ Ͳ͏͍͏σʔλΛฦ͔͢͸ɺΫϥΠΞϯτ࣍ୈͷͨΊ ˓ 3&45GVM"1*ͳΒ͹ɺฦ͢஋͕ܾ·͍ͬͯΔͨΊɺΩϟογϡ͕ޮ͘ l ֶशίετ ˓ 3&45GVM"1*͸8FCϑϨʔϜϫʔΫͷԆ௕্ʹ͋Δ ˓ (SBQI2-͸ͦ͏Ͱ͸ͳ͍ 20
  11. 21.

    ։ൃΛͯ͠Έͯͷײ૝ʢ޻෉ͨ͠ϙΠϯτʣ l ΞΫηεݖݶνΣοΫ ˓ ࿈ܞΞϓϦέʔγϣϯʹΑͬͯ ͸औಘ/(ͳϦιʔε͋Γ ˓ %#͔ΒϦιʔεͷσʔλऔಘ ޙʹνΣοΫͰ͸஗͍ ˓

    ΫΤϦΛղੳɻऔಘ͠Α͏ͱ͠ ͍ͯΔϦιʔεΛಛఆ ˙ ݖݶ͕ͳ͚Ε͹ ͜ͷ࣌఺Ͱ஄͘ ˓ ΫΤϦղੳ΋ॏ͍ ˙ NVUBUJPO͸আ֎ 21 query searchScSomeOne($scId: ID!){ sc(id: $scId) { name shopBrands { name shopCompany { name } } } } アクセス権限のない リソースの取得を検知!
  12. 22.

    ։ൃ͍ͯͯ͠ͷײ૝ʢϋϚͬͨϙΠϯτʣ l NVUBUJPOʹΑΔόϧΫΠϯαʔτɾΞοϓσʔτΛ ߦͳͬͯ΋͍͍ͷ͔ʁ ˓ ΫΤϦʹ͸ผ໊Λ͚ͭΔ͜ͱ͕Մೳ ˓ ౓ͷίʔϧͰෳ਺ͷNVUBUJPOΫΤϦΛฒ΂ͯόϧΫΠϯαʔτ ͢Δ͜ͱࣗମ͸Ͱ͖ͨ ˓

    ͔͠͠ɺݸผʹNVUBUJPOͷॲཧ࣮ߦ ˙ τϥϯβΫγϣϯ͕ޮ͔ͳ͍ ˓ ΫΤϦղੳΛߦͬͯɺόϧΫΠϯαʔτͰ͋Δ͜ͱΛݕ஌ͨ͠Βɺ τϥϯβΫγϣϯΛൃߦ͢Δ͜ͱ͸ग़དྷͦ͏͕ͩʜ ˙ Ͱ͖Δ͔Β΍͍͍͔ͬͯͱݴΘΕΔͱɺҧ͏ؾ͕͢Δ ˙ σϑΥϧτͷ(SBQI2-͸ͦ͏͍͏ಈ࡞Λظ଴͍ͯ͠Δͷ͔ʁ ˓ JTTVFΛൃݟ ˙ όϧΫΠϯαʔτ༻ͷNVUBUJPOΛఆٛ͠·͠ΐ͏ɺͱ͍͏݁࿦ ˙ ͨͩ͠ɺ࢓্༷ɺෳ਺ͷNVUBUJPOΛฒ΂Δͷ͸0, 22
  13. 23.

    ·ͱΊ l (SBQI2-͸"1*ͷίʔϧճ਺Λ࡟ݮ l σʔλ௨৴ྔΛ࡟ݮ l εΩʔϚݴޠͰܕͷఆ͕ٛՄೳ l ςετ͕༰қ l

    ͍͍͜ͱ͹͔ΓͰ͸ͳ͍ ˓ ֶशίετ͸3&45GVM"1*ʹൺ΂Δͱߴ͍ ˓ Ωϟογϡ͕ޮ͔ͤʹ͍͘ ˓ / ໰୊͕ൃੜ͠΍͍͢ 23