Firestore (direkt kapcsolat vs cloud functions)
2020-05-12T10:26:27+02:00
2020-05-16T11:46:25+02:00
2022-07-18T22:40:49+02:00
  • a "batched writes" funkcióval lehetőség van arra, hogy egyszerre több műveletet hajts végre

    Ezt nem tudtam. Jó kis dolog.

    De viszont ez is érdekel, ha security rules-ben be van állítva, hogy csak bejelentkezett felhasználó hajthat végre műveletet, de tegyük fel, valaki ehhez a fájlhoz hozzájut, létrehoz egy saját unity projektet, amiben azt ír bele amit csak akar (pl. saját felhasználó egyenlegét módosítása +végtelennel), aztán elindítja, bejelentkezik a már regisztrált nevével és végre is hajtja az adott funkciót?

    Ha létrehoz egy másik projektet ezzel a fájlal, akkor gondolom az a projekt is kapcsolatba léphet az adatbázissal, viszont a security rule-ban megadott rule-ok, ugyan úgy érvényesek maradnak az ő requestjeire, mint ha a te játékodból jött volna.
    Mutasd a teljes hozzászólást!
  • Ilyen kollekciókon átívelő tranzakciókat szerintem csak cloud function-ben lehet elvégezni (lehet tévedek).

    Most kicsit belenézve az útmutatóba, a "batched writes" funkcióval lehetőség van arra, hogy egyszerre több műveletet hajts végre, melyek akkor is végbemennek, ha közben megszakad a kapcsolat, tehát az egész műveletsort küldi el a szervernek és hajtja végre. Ebből kifolyólag gondolom megoldható, hogy akár cloud functions-ot kihagyva és meg lehessen ilyet valósítani, bár annak még nem jártam utána, hogy miként van lehetőség arra, hogy más kollekció dokumentumaitól függően változtasson egy másik kollekció dokumentumában valamit. Jó lenne olyan megoldás, ahol nem kell külön lekérdezni előtte, hanem mint mysql esetében, pl. update users, autószalonok set users.egyenleg=users.egyenleg-autoszalonok.ar where users.userid=$uid and autoszalonok.id=$autoszalonid; (Bár most hirtelen átgondolva itt is legalább 2-re van szükség, mert az egyik felhasználónak növelni kell az egyenlegét, a másiknak csökkenteni. Bár megoldás lehet, hogy az autószalonban növelem az eladások értékét, amit később a felhasználó onnan vesz ki, így mysql esetében elég lenne 1.) De most nem mysql-ről beszélünk ugye.. :D

    Nem tudom, hogy milyen infók vannak az account.json-ben

    Kicsit kevertem a dolgokat, ezt a fájlt a google adja, de a service_account.json ahhoz kell, ha egy szerverről akarsz hozzáférést a projecthez, mint adatbázis, stb., ezt tartalmazza a szükséges kulcsokat. Unity esetében viszont csak a GoogleService-info.plist-re van szükség, ez szintén a hozzáféréshez való adatokat tartalmaz, mivel egyébként c#-ben nem kell megadnom semmilyen adatot az adatbázisomról vagy a projectemről, tehát nem úgy mint php esetében mysql-hez kapcsolódna név/jelszó adatbázis stb..
    De viszont ez is érdekel, ha security rules-ben be van állítva, hogy csak bejelentkezett felhasználó hajthat végre műveletet, de tegyük fel, valaki ehhez a fájlhoz hozzájut, létrehoz egy saját unity projektet, amiben azt ír bele amit csak akar (pl. saját felhasználó egyenlegét módosítása +végtelennel), aztán elindítja, bejelentkezik a már regisztrált nevével és végre is hajtja az adott funkciót? (Nyílván ehhez tudni kell az adatbázis struktúráját, de ennyire ne becsüljük le a hackereket, ez a legkevesebb már szerintem..)

    Tehát itt a biztonság érdekel, mert hozzájut egy ilyen fájlhoz, aztán kész vége. Vagy pl. egy nagyon fullos Nasa feltörő hacker, megnézi milyen adatokat továbbít a szervernek (nyílván titkosított meg minden egyebek, de ha minimális esély van feltörni, akkor fel is lehet), és azt módosítgatja?

    Ezért tartottam a cloud functions-t hasznosnak, mert pl. beállítom, ha lehetséges a security rules-ben, hogy módosításokat kizárólag a cloud functions-ból hajtson végre, onnantól kezdve bármilyen hülyeséget küld a szervernek, nem fogja végrehajtani. (Még akkor sem, ha komplett az egész játékot feltörné át tudná írni, szerverhez hozzáférési kulcsa van stb., mert egyszerűen nem engedélyezett, csak a szerveren lévő fájlból, amit nem tud módosítani.)

    Jó a gondolatmenetem, vagy hülyeség?
    Mutasd a teljes hozzászólást!
  • Ilyen kollekciókon átívelő tranzakciókat szerintem csak cloud function-ben lehet elvégezni (lehet tévedek).

    Nem tudom, hogy milyen infók vannak az account.json-ben, azt neked kellene megnézni, hogy azzal közvetlenül lehet-e az adatbázist elérni. Ha nem, akkor meg a cloud function-ben check-olva van, hogy a user bevan-e jelentkezve.
    Mutasd a teljes hozzászólást!
  • Akár fel lehet venni egy kollekciót, amiben a userek vannak és azok jogosultsága. Majd a security rule-ban megkaphatod a belépett kliens uid-ját, ez alapján meg a kollekcióból lekérdezhető a jogosultsága, amit a security rule-ban felhasználhatsz úgy hogy booleanra értékeled ki, ha igaz, akkor a tranzakció végbe mehet.

    Na igen így egy kissé bonyolultnak tűnik, na most nézzünk egy konkrét egyszerű példát inkább, az a biztos.
    User kollekció -> userid doc -> name, egyenleg, autók.
    Autószalonok kollekció -> autószalon_id doc-> tulajdonos_id (megegyezik az userid-el), ár, készlet

    Végrehajtanék egy olyan műveletet, hogy Pista (userid = 1 doc) akar vásárolni egy autót autószalon_id autószalonból, akinek tulajdonosa Géza (userid 2, az user kollekcióban a 2-es számú doc, az autószalonok kollekcióban a tulajdonos_id = 2)

    Cloud func:
    Pista meghívja vásárlás funkciót, elküldi az autószalon_id-t és hogy 1 db-ot akar vásárolni. A cloud funkció először is csak a bejelentkezett user esetén működik, ez esetben pedig a Firebase SDK automatikusan továbbítja az userid-t (context.auth.uid), ezek alapján levonjuk az user kollekcióban Pistához tartozó egyenlegből az adott autószalon dokumentumban lévő gépkocsi árát, valamint az user kollekcióban ezt az összeget hozzáadjuk az autószalon tulajdonosához (Gézához), aminek a dokumentumnak a neve az autószalonban a tulajdonos_id, FELTÉVE, ha a készlet nagyobb mint a vásárolt mennyiség, valamint van elegendő egyenlege Pistának. (szerk - na meg persze levonjuk a készletet.)
    (Plusz egy tranzakciók kollekcióban ezt tárolnám is, hogy visszakövethető legyen.)

    Nagyon még nem nézegettem meg, hogy ehhez először lekérdezés szükséges-e firebase nosql esetében, aztán módosítás, vagy egy műveletben végrehajtható-e az egész, de nagyjából ilyenek is zajlanak a játékban. Ezt cloud functionsban index.js-ben távol a klienstől egyszerűen, biztonságosan meg lehet valósítani, különböző security rule nélkül, vagyis csak annyi, hogy csak bejelentkezett felhasználó tudjon módosítani. Onnantól kezdve úgyis minden írás a cloud functions-on keresztül zajlana, amiben én simán ellenőrzöm ezeket, hogy végrehajtható-e vagy sem.

    Ugyanezt kliens oldalon, attól már félek, mert ha esetleg ehhez több műveletet kell végrehajtani, és valahogy sikerül meghackelni a kliens oldalt, nehogy mégis végrehajtható legyen ez a művelet, hogy esetleg a lekérdezett Géza helyett Juliska kapja meg a pénzt, vagy akkor is végrehajtódjon, ha nincs is elegendő egyenlege, stb.

    Távol a klienstől ellenőrizni ezeket nekem biztonságosabbnak tűnik.

    Sajnos nem vagyok tisztában, hogy egy hozzáértő egy androidos telefonon a telepített alkalmazásba milyen módon tud esetlegesen belenyúlni, hozzáférni. (Bár ha ebből indulunk ki, hogy ha ez lehetséges, akkor eleve a google service account.json fájlt ha ki tudná szedni az alkalmazásból és belerakja a saját alkalmazásba, akkor bármihez hozzáférhet, hiszen az engedélyezi a hozzáférést az adatbázisomhoz, cloud Functions-hoz, bármihez igazából..) Tehát feltörhető-e maga a játék? Mert ha nem, semmilyen módon, akkor a cloud functions-ot is ki lehet hagyni, a játékon belül lekérdezem az adatbázisból a cuccokat és végrehajtom, ha szabad neki.
    Mutasd a teljes hozzászólást!
  • A firestore-ban meglehet adni security rule-okat. Itt korlátozhatod, hogy mi alapján írhat vagy olvashat egy kliens a kollekciókból. Például csak regisztrált felhasználó hajthat végre írást vagy olvasást. 

    Akár fel lehet venni egy kollekciót, amiben a userek vannak és azok jogosultsága. Majd a security rule-ban megkaphatod a belépett kliens uid-ját, ez alapján meg a kollekcióból lekérdezhető a jogosultsága, amit a security rule-ban felhasználhatsz úgy hogy booleanra értékeled ki, ha igaz, akkor a tranzakció végbe mehet. 
    Security Rules! ?

    De ha az kell, akkor szerintem még a játékban levő egyes cselekvéseket is lehet validálni security rule-ban. Pl. egy ütés csak 50-et sebezhet, akkor meglehet nézni, hogy a kéréssel valóban 50 jött-e be. Meg hasonlók.

    Az olyan műveletek, amik nem csak a kliens állapotát módosítják, vagy nagyon bonyolult logikával rendelkezik (validáció, ...) pl. fizetés, azt hagynám a cloud funcion-ben.
    Mutasd a teljes hozzászólást!
  • Mindenfele rulet tudsz raaggatni a firestore ra, de ez mar probb. Functionst sztem akkor erdemes hasznalni ha clouddal kommunikalsz, amugy sima firebaset. En amikor js es deployolos cloud functionoket irtam akkor googlr cloud sql ne matattam, pont a firestore sok hibaja miatt. 
    Tobbmillio rekordot tud nyilvan, meg vmilyen szinten cache el is, de meg van sok gyerekhibaja. Ha sok userre tervezel, akkor sok penz lesz, erre gondoltam. 
    Nem parezerrol beszelek hanem milliorol mondjuk, petsze attol fugg minden szart tarolsz e benne, mennyit kerdezel le, irsz stb. Konnyen at lehet billeni sztem asok lekeres iranyaba, ha azt hiszed ez egy mysql.
    Mutasd a teljes hozzászólást!
  • Sok userre tervezek, pontosan ezért döntöttem emellett, mert php+mysql esetén külön foglalkozni kellene a szerverekkel, skálázódással, stb., ami tőlem sajnos tág fogalom.
    A firebase rendszer azért tetszik, mert automatikus minden. Igaz, valamivel drágább, de olyan adatbázist szeretnék, ahol ezeket a dolgokat nem nekem kell elvégezni, még ha picit költségesebb is.
    Nem google cloud sql és cloud functions, hanem Firestore adatbázis és cloud functions, igen, nosql, de már kezdek elég jól belejönni. :) Mit értesz azon, hogy kinövöm? A drága azzal lehet egyetértek, de ha anyagilag bírom, akkor itt elvileg nem jelenthet problémát milliós userek kezelése sem, nem?
    De ezen a kérdésen már túl jutottunk, persze köszönöm a véleményed, minden vélemény fontos, csak ezt már fogjuk rá, hogy eldöntöttem, a legegyszerűbb számomra ha ezt a rendszert használom, itt a Firebase Auth is be van építve, a biztonságot és az esetleges nagy terhelést számomra így a legegyszerűbb kivitelezni, ha az egész egyetlen rendszerben van ami full automatikus.

    Itt inkább most az a kérdés, ha ennél a rendszernél maradok, akkor a biztonság miatt érdemes cloud functions, vagy nincs abból semmi probléma, ha közvetlen csatlakozok az adatbázishoz?
    Tehát előnyök hátrányok, hasonló.. Előny nyílván a sebesség és a költségek, ha kihagyom a cloud functions-ot, hátrányok érdekelnének, és ami miatt leginkább aggódok az a biztonság. Ha nem a szerver ellenőrzi a bejövő adatokat, és hogy azok alapján mit hajtson végre, hanem maga a kliens ellenőrzi ezeket, megbuherálható-e a kliens?

    Köszönöm:)
    Mutasd a teljes hozzászólást!
  • Firebase/store problemas, ugye NOSQL, teljesen mas mint egy MYSQL

    Csomo problema van vele, ha ugy akarod kezelni mint egy mySql-t, miert valasztottad ezt? Hany userre tevezel? Sokezerre, milliora?

    Ha kevesre, akkor jo, ha nem, akkor hamar kinovod, es draga.

    A legjobb  megoldas meg mindig a php, mysql, bar tudom nem trendi :D

    Ha meg google cloud sql es cloud functions, akkor sztem mar ugyanott tartasz majdnem :D
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Korábban már feltettem egy kérdést, hogy milyen lehetőséget javasoltok egy Unity-ben készült játék adatbázis kezeléséhez, Amazon és Firebase jött szóba, végül a Firebase mellett döntöttem, azon belül is Firestore adatbázis. Nem realtime dologról van szó, egyszerű lekérdezésekről az adatbázisból.

    A kérdésem az, hogy Unity-ben van lehetőség arra, hogy közvetlen csatlakozzak az adatbázishoz, de lehetséges az is, hogy mindössze egy http request-tel kommunikálok a cloud functions-al (tehát a szerveren tárolom a kódot), majd pedig visszajön a válasz a kliensbe.
    Ami engem a leginkább aggaszt, az a biztonság. Alapesetben én úgy gondolom, hogy a felhasználó kezébe nem kell eljuttatni azokat a kódokat, amik létfontosságú adatbázisműveleteket hajtanak végre. Ha közvetlen csatlakozok az adatbázishoz a kliensből, akkor pedig ez történik. Itt a feltörés ellen védekeznék, hogy ha valamilyen módon lehetséges a játék meghackelése, akkor ne tudjanak olyan műveletet végrehajtani az adatbázisban, amit neki nem szabad. Persze, sokféle biztonság beállítható, tehát pl. csak a bejelentkezett felhasználó tudjon végrehajtani bármit az adatbázisban, ez természetesen alap, mégis félek attól, ha feltörik és kicsit át tudják írni, akkor akár bármit végrehajthat az adatbázisban. Lehetséges ez?
    Kicsit olyan érzésem van, ha minden a kliens oldalon van, mint ha egy php fájl forráskódját odaadnám a játékosnak, benne az adatbázis elérhetőséggel mindennel, írd át, aztán csinálj amit akarsz...

    Sok olyan művelet van a játékban, ahol pl. játékos egyenlegek is mozognak, sőt akár más felhasználónak is lehet küldeni (fogalmazzunk így az egyszerűség kedvéért.) Én minden adatbázis írást úgy terveztem, hogy a cloud functions-on keresztül zajlódjon, vagyis ilyenkor meghívom azt a funkciót, továbbítom a szükséges adatokat, majd pedig a szerveren dől el, lekérdezéssel, hogy az amit az adott felhasználó szeretne arra tényleg jogosult-e, majd pedig végrehajtja és visszajön az eredmény. 
    Ha ez közvetlen az adatbázishoz való csatlakozással történne, akkor attól félek, meg lehetne buherálni, hogy a lekérdezés eredményétől függetlenül (ami eldönti, hogy végrehajthatja e vagy sem), kicsit meghackelni a kliens kódot máris végrehajtható lehetne az a dolog amit nem szabadna. Kis átírással bármit módosíthatna az adatbázisban. Persze nem vagyok hacker, nyílván ki van ez találva, hogy elég nehéz lenne meghackelni egy kész játékot, de érdekel, hogy lehetséges lehet-e?

    Jó-e a gondolatom, hogy inkább cloud functionson keresztül hajtsam végre az ilyen műveleteket (tehát tulajdonképpen az összes írást az adatbázisba), vagy nyugodtan közvetlenül is csatlakozhatok, lehetetlen feltörni? Milyen veszélyei lehetnek? Ha az íráshoz cloud functions-ot használok, akkor az olvasáshoz kapcsolódhatok közvetlenül is? Vagy legyen írás és olvasás is cloud functions-on keresztül?

    Számomra biztonságosabbnak tűnik, ha egyszerűen nem engedem az írást sehonnan máshonnan, csak és kizárólag a functions-on keresztül (bárhogy manipulálják bármilyen adatokat küldenek, az úgyis csak azt hajtja végre, amit én engedélyezek), de lehet alaptalan a félelmem. Ebben szeretnék tanácsot kérni, aki jártasabb ilyen témában.

    Köszönöm mindenkinek.
    Mutasd a teljes hozzászólást!
abcd