SkillHubi sisselogimine — arendaja juhend
See dokument kirjeldab, kuidas arenduses SkillHubi igal platvormil sisse
logida. Võlulingid (magic link) saadetakse Resendi kaudu kinnitatud
skillhub.ee saatedomeenilt igas keskkonnas.
1. Voog ülevaates
mobiilirakendus skillhub-app.pages.dev postkast
│ sisesta e-post │ │
│ ───────────────────── │ │
│ │ POST /api/auth/... │
│ │ → mailer.sendMagicLink │
│ │ ─────────────────────────► │
│ │ │
│ kasutaja avab lingi süsteemibrauseris │
│ │ GET /api/auth/native-bridge │
│ │ → vermib OTT, suunab ümber: │
│ │ skillhub://auth/callback │
│ ◄────────────────────┘ ?ott=… │
│ appUrlOpen kuulaja → oneTimeToken.verify │
│ set-auth-token salvestatud → Pinia user täidetud │
│ router.replace('/tabs/home') │
Veebiäpp kasutab tavalisi küpsisepõhiseid sessioone ega puuduta OTT silda — ta tarbib võlulingi samas brauseri vahekaardis.
2. Veeb (brauser)
cd apps/web
pnpm dev # → http://localhost:3000
- Klõpsa paremas ülanurgas Logi sisse.
- Sisesta e-post lehel
/login. - Ava võlulink oma postkastist.
- Maandud lehele
/welcomekoos sessiooniküpsisega.
3. iOS — Xcode'i simulaator või seade
cd apps/mobile
pnpm build && pnpm exec cap sync ios
pnpm exec cap open ios # avab Xcode
Xcode'is: vali simulaator (iPhone 16 Pro on Galaxy S25 saareekraani paigutusele lähim vaste). Vajuta ▶︎.
- Rakendus käivitub aknas
/tabs/homeja näitab välja logitud CTA-d. - Toksa Logi sisse → sisesta e-post → toksa Saada sisselogimislink.
- Ava võlulink oma postkastist Mobile Safaris.
- Safari pöördub
/api/auth/native-bridgepoole, mis suunab aadressileskillhub://auth/callback?ott=…. iOS küsib, kas avada SkillHub; luba. - Pinia salv tarbib OTT ja suunab sind aknasse
/tabs/home.
VITE_API_BASE_URL vaikimisi on https://skillhub-app.pages.dev. Vajadusel
sea see failis apps/mobile/.env.local, et osutada kohalikule Wrangleri
arendus-API-le.
4. Android — Android Studio (sh. Galaxy S25 emuleerimine)
Vaikimisi AVD-loendis on ainult Pixeli seadmed. Galaxy S25 Ultra profiili saamiseks:
Android Studio → Tools → Device Manager → Create Device.
Vali Phone → Pixel 8 Pro (6,7" 1344×2992 ekraan — lähim S25 Ultra 1440×3120 suhtele) ja nimeta AVD ümber
Galaxy S25 Ultra.Vali süsteemitõmmis API 35 (Android 15), sama põlvkond, millele One UI 7 ehitati. One UI-d AVD-le seaduslikult paigaldada ei saa; kasuta stock Android 15 — see paljastab samad API-d, millega rakendus suhtleb.
Käivita rakendus:
cd apps/mobile pnpm build && pnpm exec cap sync android pnpm exec cap open android # või: pnpm exec cap run androidSisselogimisvoog on identne iOS-iga, ainult et võlulingi ümbersuunamine maandub Chrome'is ja Android pakub SkillHubi avamist
skillhub://skeemi kaudu.
5. E-posti saatmine (Resend)
Võlulingid saadetakse Resendi HTTP API kaudu kinnitatud skillhub.ee
saatedomeenilt (vaikimisi info@skillhub.ee). Iga sisselogimiskatse
juures pöördub worker mailer.sendMagicLink() poole, mis POSTib aadressile
https://api.resend.com/emails; kui RESEND_API_KEY puudub või Resend
tagastab mitte-2xx koodi, päring kukub läbi ja kasutaja näeb viga.
Ava url selle seadme süsteemibrauseris, kus rakendus jookseb, et
süvalingi üleandmine töötaks. Kui kleebid selle Capacitori WebView'sse
endasse, ei käivitu OTT sild. Oluline täpsustus: kui avad lingi oma Maci
brauseris (Chrome, Safari), läheb voog katki — macOS-il pole skillhub://
skeemi jaoks ühtki rakendust registreeritud, nii et ümbersuunamine sureb
vaikselt ja sa näed tühja lehte.
6. Vajalikud keskkonnamuutujad (Cloudflare Pages)
| Võti | Kus | Otstarve |
|---|---|---|
BETTER_AUTH_SECRET |
Pages | Sessiooni/JWT allkirjastamine |
RESEND_API_KEY |
Pages | Võlulingi e-posti saatmine Resendi kaudu |
EMAIL_FROM |
Pages | From-päis, vaikimisi SkillHub <info@skillhub.ee> |
SEED_TOKEN |
Pages | Kaitseb /api/admin/* |
VITE_API_BASE_URL |
mobile build | Suunab WebView'i API päritolu suunas |
7. WebView'i silumine
Capacitori WebView on lihtsalt Safari (iOS) või Chrome (Android), seega saad jooksva rakenduse külge ühendada täisväärtusliku DevToolsi sessiooni.
iOS — Safari Web Inspector
- Seadmes või simulaatoris: Settings → Safari → Advanced → lülita sisse Web Inspector.
- Macis: Safari → Settings → Advanced → lülita sisse Show features for web developers.
- Käivita rakendus Xcode'ist (silumiskoosted paljastavad WebView'i; TestFlight ja App Store'i koosted seda ei tee).
- Safaris: menüüriba → Develop → [Sinu seade] → SkillHub. Avaneb tavaline DevToolsi aken WebView'i kohal.
Nüüd saad:
- Vaadata DOM-i — kontrolli, et
<ion-input>on tegelikult renderdatud ja selle kõrgus pole null. - Lugeda Console'i Vue/Pinia vigade osas, mida iOS-i logi alla neelab
(
UIScene/RTIInputSystemClientread Xcode'is on müra, mitte vead). - Jälgida Network'i osas
/api/auth/...päringuid ja kontrollida, etVITE_API_BASE_URLosutab sinna, kuhu eeldad. - Käivitada konsoolis
document.querySelector('ion-input').shadowRoot, et uurida Ionicu varju-DOM-i, kui sisestus on nähtamatu — see tähendab tavaliselt, et märgistuses on veel vana sildi-ümbristamise muster; vaheta see vastu<IonInput :label="…" fill="outline" />(Ionic 8 moodne API).
Android — Chrome DevTools
- Seadmes: lülita sisse Developer options → USB debugging.
- Ühenda see Maciga/PC-ga; nõustu RSA sõrmejälje viibaga.
- Ava Chrome →
chrome://inspect/#devices. - Leia SkillHub Remote Target all ja klõpsa inspect.
DevToolsi liides on identne lauaarvuti Chrome'i sessiooniga ja töötab nii päris seadmete kui ka emulaatori AVD-de vastu.
Mida vaadata, kui "Logi sisse" viib tühjale ekraanile
| Sümptom DevToolsis | Tõenäoline põhjus |
|---|---|
<ion-content> on renderdatud, aga height: 0 |
Marsruudikomponendis puudub IonPage ümbris |
<ion-input> on olemas, aga visuaalselt tühi |
Vana <label><IonInput/></label> muster iOS-il |
| Marsruut muutus, aga DOM näitab endist vaadet | IonRouterOutlet pole haagitud (vaata App.vue kesta) |
Console: Cannot read properties of undefined |
Pinia salv pole initsialiseeritud; vaata main.ts järjekorda |
8. Pakkujate sidumise strateegia (Apple / Google / Smart-ID)
SkillHub pakub nelja sisselogimisviisi: võlulink, Apple, Google ja
Smart-ID. Kõik neli viivad ühe users reani inimese kohta, seega on
vaja selget sidumisreeglit hetkeks, kui naasev kasutaja logib sisse
pakkujaga, mida ta esimesel korral ei kasutanud.
Tõe allikas
users— üks rida inimese kohta, võtmestatudid-ga.users.emailon unikaalne ja seda käsitletakse kanoonilise tunnusena pakkujate vahel.accounts— üks rida iga(provider, providerAccountId)paari kohta, ühendatudusers-igaaccounts.user_idkaudu. Selle tabeli haldab Better Auth.users.email_verified_aton usaldusvärav, mis võimaldab automaatset sidumist. Pakkuja e-post läheb arvesse ainult siis, kui see tagastati kinnitatuna (Appleemail_verifiednõue, Googleemail_verifiednõue, SK ID Solutions tagastab ainult kinnitatud ETSI semantikaga tunnuseid, seega Smart-ID on definitsiooni järgi alati kinnitatud).
Reeglid sisselogimise hetkel
- Otsi olemasolevat
accountsrida(provider, providerAccountId)järgi.- Kui see eksisteerib → logi see
usersrida sisse. Valmis.
- Kui see eksisteerib → logi see
- Vastasel juhul tõmba e-post pakkuja nõuetest.
- Kui pakkuja kinnitab, et e-post on verifitseeritud ja selle
e-postiga
usersrida juba eksisteerib → kirjuta uusaccountsrida, mis viitab sellele kasutajale, ja logi sisse. Kasutaja näeb ühekordset toosti: "Sisse logitud Apple'iga — seotud sinu olemasoleva e-posti kontoga." - Kui e-post pole kinnitatud või puudub (Apple'i "Peida mu e-post"
tagastab releeaadressi, mida me alati usaldame, sest Apple omab
seda nimeruumi, kuid teised pakkujad peavad olema kinnitatud) →
loo värske
usersrida +accountsrida.
- Kui pakkuja kinnitab, et e-post on verifitseeritud ja selle
e-postiga
- Smart-ID on eriline: vastus kannab isikukoodi, mitte e-posti.
Salvestame selle veergu
users.national_identification_numberja käsitleme seda veergu teise unikaalvõtmena sidumiseks.- Smart-ID sisselogimine tuntud PNO-ga seob sobiva
usersreaga sõltumata e-postist. - Smart-ID sisselogimine värske PNO-ga loob uue
usersrea ja palub kasutajal hiljem e-post lisada (kohustuslik enne kui väljamakseid saab teha).
- Smart-ID sisselogimine tuntud PNO-ga seob sobiva
Manuaalne sidumine profiililt
Plaadiplokk "Ühendatud kontod" /tabs/profile lehel laseb kasutajatel:
- Lisada Apple/Google'i konto e-posti-põhisele sisselogimisele
(üheklõpsuline OAuth nõusolek → kirjuta
accountsrida). - Verifitseerida oma identiteet Smart-ID-ga (juba ühendatud — vt
§30.11 failis
PROJECT_REFERENCE.md). Õnnestumisel täidetakseusers.national_identification_numberja Smart-ID-st saab sellele kasutajale sisselogimisvalik. - Eemaldada mis tahes pakkuja seos, kui vähemalt üks tunnustus jääb alles (võlulink kinnitatud e-posti kaudu loeb alati).
Mida me ei tee
- Me ei loo kunagi automaatselt kontosid kinnitamata pakkuja e-postide jaoks. See avaks konto ülevõtmise augu, kui ründaja kontrollib kirjavea e-posti ja seaduslik kasutaja proovib hiljem õige e-postiga registreeruda.
- Me ei liida kunagi vaikselt kahte
usersrida. Kui Smart-ID PNO vastab ühele kasutajale ja Google'i e-post teisele, näidatakse kasutajale lepitusekraani, kus ta saab valida, milline rida jääb alles.
Kus see koodis elab
- Server:
apps/web/server/utils/auth.tsseadistab Better Authi konto sidumise poliitika (accountLinking: { enabled: true, trustedProviders: ['apple', 'google'], allowDifferentEmails: false }). Kui Apple/Google'i tunnustused saabuvad, ühendame pakkujad sealt. - Mobiil:
apps/mobile/src/views/SignInView.vuepaljastab kolm sotsiaalvõrgustiku nuppu. Smart-ID elab praegu/verify/smart-idtaga (sisselogimisjärgne identiteedi kinnitamine); tulevane iteratsioon lubab seda ka esmase teguri sisselogimisena, vermides ühekordse žetooni eduka demokeskkonna sessiooni põhjal.
9. Tõrkeotsing
- "Logi sisse" maandub tühjal ekraanil — tavaliselt tähendab see, et
IonHeader kasutas
collapse="fade"ilma sidustatud suure tiitli kondenstoolribata. Parandatud failisAppScreen.vue; ehita uuesti +cap sync, kui näed seda vanemal komplektil. - E-post ei saabu kunagi — kontrolli, et
RESEND_API_KEYon Pages projektis seatud, ja inspekteeri Resendi juhtpaneeli kohaletoimetamise/ bounce-i sündmuste osas.skillhub.eesaatedomeen peab olema Verified olekus. - Süvalink ei ava rakendust — kontrolli, et
skillhub://on registreeritud failisapps/mobile/ios/App/App/Info.plist(CFBundleURLSchemes) ja failisapps/mobile/android/app/src/main/AndroidManifest.xml(<data android:scheme="skillhub" />).cap synctaasloob need failistcapacitor.config.ts.
10. Pakkujate tunnustuste hankimine
.env.example failid (juur + apps/mobile/) sisaldavad iga pakkuja
jaoks kohatäiteid TODO(acquire) markeritega. Täida need pärast alltoodud
sammude tegemist.
10.1 Sisselogimine Apple'iga
Vajalikud env-võtmed (juure .env): APPLE_SERVICE_ID (Services ID,
nt com.skillhub.web), APPLE_TEAM_ID, APPLE_KEY_ID,
APPLE_PRIVATE_KEY (mitmerealine PEM). Mobiilne peegel:
VITE_APPLE_SERVICE_ID.
- Logi sisse aadressile https://developer.apple.com/account meeskonna konto omanikuna. Meeskond peab olema registreeritud tasulises Apple Developer Programmis ($99/aastas).
- Certificates, Identifiers & Profiles → Identifiers:
- Veendu, et iOS App ID-l (
com.skillhub.app) on Sign In with Apple lubatud. Kui ei, redigeeri ja märgista see võimekus. - Klõpsa + → Services IDs → Continue. Identifikaator
com.skillhub.web, kirjeldusSkillHub Web Auth. Märgista Sign In with Apple, seejärel Configure → primary App ID = iOS App ID, Domainsskillhub.app(prod) jalocalhost(dev), Return URLshttps://skillhub.app/api/auth/callback/applejahttp://localhost:3001/api/auth/callback/apple.
- Veendu, et iOS App ID-l (
- Keys → + (Create a key): nimi
SkillHub Sign In With Apple, märgista Sign In with Apple, Configure → primary App ID = iOS App ID. Continue, Register, Download.p8fail (üks võimalus — hoia turvaliselt). Märgi 10-tähemärgiline Key ID. - Sea env muutujad:
APPLE_SERVICE_ID=com.skillhub.web(Services ID, MITTE iOS-i bundle id — Better Auth kasutab seda OAuthiclient_id-na).APPLE_TEAM_ID=10-tähemärgiline ID arendaja portaali ülanurgast.APPLE_KEY_ID=ID 3. sammust.APPLE_PRIVATE_KEY=kleebi kogu.p8sisu, kaasa arvatud-----BEGIN PRIVATE KEY-----ja-----END PRIVATE KEY-----read..envfailides ümbritse jutumärkidega ja kasuta päris reavahetusi; Cloudflare'is sea saladusenawrangler secret put.VITE_APPLE_SERVICE_ID=peegelda Services ID mobiilse.env-i, et Capgo plugin kasutaks sama OAuthiclient_id.
- Põlissoiks (iOS rakendus): failis
apps/mobile/ios/App/App.xcworkspace, sihtmärk App → Signing & Capabilities → + Capability → Sign In with Apple. Capacitor@capgo/capacitor-social-loginloeb komplekti õigusi; põlise poole jaoks JS env muutujat ei vajata. - Test: dev/prod-il on kummalgi oma Services ID tagastus-URL.
- Veeb:
https://skillhub.app/sign-in→ toksa Apple → nõusoleku ekraan → ümbersuunamine →/api/auth/callback/apple→ küpsis seatud,/tabs/home. - iOS: TestFlight koost → toksa Apple → põlislehe →
usersrida kas luuakse või seotakse-kinnitatud-e-postiga §8 järgi.
- Veeb:
10.2 Sisselogimine Google'iga
Vajalikud env-võtmed (juure .env): GOOGLE_OAUTH_CLIENT_ID_WEB,
GOOGLE_OAUTH_CLIENT_SECRET, GOOGLE_OAUTH_CLIENT_ID_IOS,
GOOGLE_OAUTH_CLIENT_ID_ANDROID. Mobiilne peegel:
VITE_GOOGLE_OAUTH_CLIENT_ID_WEB, VITE_GOOGLE_OAUTH_CLIENT_ID_IOS.
- Logi sisse aadressile https://console.cloud.google.com/. Loo
projekt
skillhub-prod(jaskillhub-devlokaalseks) või vali olemasolev. - APIs & Services → OAuth consent screen:
- Kasutaja tüüp External, rakenduse nimi
SkillHub, toe e-post, logo, domeenskillhub.app, arendaja kontakt. - Skoobid:
openid,email,profile. Tundlikke skoope ei kasuta — hoiab meid Google'i kinnitamise järjekorrast eemal. - Testi kasutajad: lisa arendusmeeskonna e-postid, kuni rakendus on Published (nupp consent screen lehe ülaosas).
- Kasutaja tüüp External, rakenduse nimi
- APIs & Services → Credentials → + Create Credentials → OAuth
client ID:
- Rakenduse tüüp Web application, nimi
SkillHub Web. - Lubatud JavaScripti päritolud:
https://skillhub.app,http://localhost:3001. - Lubatud ümbersuunamise URI-d:
https://skillhub.app/api/auth/callback/google,http://localhost:3001/api/auth/callback/google. - Salvesta → kopeeri kliendi ID + saladus väljadesse
GOOGLE_OAUTH_CLIENT_ID_WEB/GOOGLE_OAUTH_CLIENT_SECRET.
- Rakenduse tüüp Web application, nimi
- Korda Create Credentials → OAuth client ID tüübiga iOS,
bundle ID
com.skillhub.app. Kopeeri saadud kliendi ID väljaleGOOGLE_OAUTH_CLIENT_ID_IOS(põlistele klientidele saladust pole). Korda Androidi jaoks (vajalik SHA-1 sõrmejälg) →GOOGLE_OAUTH_CLIENT_ID_ANDROID. - Test:
- Veeb:
https://skillhub.app/sign-in→ Google → nõusolek →/api/auth/callback/google. - iOS: toksa Google failis
SignInView.vue→ ASWebAuthenticationSession avaneb → nõusolek → süvalink tagasiskillhub://oauth/google.
- Veeb:
10.3 Smart-ID (tootmine)
Vajalikud env-võtmed (juure .env): SMART_ID_RP_UUID,
SMART_ID_RP_NAME, SMART_ID_BASE_URL=https://rp-api.smart-id.com/v3,
pluss mTLS kliendisertifikaat + võti Wrangleri saladustena (mitte
versioonihalduses).
- Saada e-kiri aadressile support@sk.ee registreeritud SkillHub Estonia domeenilt, milles teatad kavatsust liituda Smart-ID Relying Party võrgustikuga. Lisa ettevõtte registreerimisnumber ja tootmise hostinimi, millelt päringud lähtuvad.
- Allkirjasta SK Master Service Agreement + Smart-ID Authentication Service lisand (~1 nädal juriidilist edasi-tagasi). Andmekaitse spetsialist peab allkirjastama isikukoodide töötlemist katva DPA.
- SK väljastab:
- Tootmise RP UUID (32 tähemärki) →
SMART_ID_RP_UUID. - Tootmise RP nime (kuvasõne, mida näidatakse Smart-ID rakenduses)
→
SMART_ID_RP_NAME(peab olema täpselt nende heaks kiidetud juriidiline nimi). - Tootmise mTLS kliendisertifikaat + privaatvõti. SK nõuab tootmise liikluseks mTLS-i; demoliivakast seda ei nõua.
- Tootmise RP UUID (32 tähemärki) →
- Salvesta sertifikaat + võti Cloudflare Workeri saladustena:
wrangler secret put SMARTID_CLIENT_CERT_PEM,wrangler secret put SMARTID_CLIENT_KEY_PEM. Uuendaapps/web/server/utils/smartId.ts, et lisada needfetchkõnele, kui RP_UUID lülitub demo-väärtuselt eemale. - Test: SK pakub "go-live" kontrollnimekirja pluss väikese
testitehingute eraldise. Käivita samad voolud, mis täna demo
liivakastis edukalt läbivad (
30303039914õnnestub,30303039816keeldub), kuid päris PNO koodide vastu.
10.4 Capgo sotsiaalvõrgustiku sisselogimise plugin
Kui Apple ja Google'i tunnustused on paigas, paigalda plugin
(pnpm --filter @skillhub/mobile add @capgo/capacitor-social-login),
seadista see failis apps/mobile/src/main.ts iOS-i kliendi ID-dega,
seejärel asenda socialNotice pügalad failis
apps/mobile/src/views/SignInView.vue SocialLogin.login() kõnedega.
Veebipool jääb Better Auth → /api/auth/sign-in/social, sest Capgo
plugin tarnib ainult põliseid SDK-sid.
11. Push-teavitused — FCM (Android) ja APNS (iOS)
Töövõtu päringu teavitused kirjutavad juba ridu tabelisse notifications,
nii et rakendusesisene postkast töötab ilma välisteenusteta. Push'i
levitus (apps/web/server/utils/notify.ts → dispatchPush) on nüüd
ühendatud FCM HTTP v1 API-ga: kui FCM_SERVICE_ACCOUNT_JSON on
Cloudflare Pages'i saladusena seatud, saadab iga Androidi (ja FCM-iga
ühendatud iOS) tunnus päris push-teate. Saladuse puudumisel langeb
kood vaikselt tagasi console.info stub'ile, nii et lokaalne dev jätkab
toimimist. Mobiilne liim, tabel device_tokens (migratsioon
0013_many_silhouette) ja registreerimise otsapunkt on kõik valmis.
11.1 Mobiilne liim (juba ühendatud)
@capacitor/push-notifications@^8on paigaldatud asukohasapps/mobile.apps/mobile/src/composables/usePushNotifications.tsküsib loa, registreerub, kuulabregistrationsündmust ja POST-ib{ token, platform }aadressile/api/me/device-tokens. Tunnuse rotatsioon POST-itakse uuesti automaatselt (server upsert-ib unikaalsetokenveeru järgi ja tühjendabrevokedAt).apps/mobile/src/App.vuekutsubinitPushNotifications(), kui Pinia auth-store teatab sisse logitud kasutajast, jateardownPushNotifications()välja logimisel (mis DELETE-ib tunnuse, et märgistada see serveripoolselt eemaldatuks).- Vastav serveri marsruut elab failis
apps/web/server/api/me/device-tokens.post.ts(ja.delete.ts); skeem on failispackages/db/src/schema/communications.ts → deviceTokens.
Uuele pluginale olemasolevatest checkout-idest peale jõudmiseks:
pnpm --filter @skillhub/mobile install
cd apps/mobile && npx cap sync
11.2 Firebase Cloud Messaging (Android)
- Loo Firebase'i projekt aadressil https://console.firebase.google.com.
- Lisa Androidi rakendus — paketinimi
ee.skillhub.app(vastab failisapps/mobile/android/app/build.gradleolevaleapplicationId-le). Laadi allagoogle-services.jsonja paiguta see asukohtaapps/mobile/android/app/. Kommiti see (saladusi pole — fail on Google'i API-võtme dokumentatsiooni järgi avalikult mõeldud) või suuna CI kaudu, kui meeskond eelistab. Rakenduse tasemelbuild.gradlesisaldab juba kaitstudapply plugin: 'com.google.gms.google-services'plokki, mis aktiveerub hetkel, kui JSON on kohal — täiendavaid Gradle muudatusi pole vaja. - Gradle'i ühendus on juba paigas versioonil
4.4.4(Capacitori skafold kasutab vana buildscript-süntaksi — ekvivalentne Firebase'i uuemale Plugin DSL-ile):apps/mobile/android/build.gradle:classpath 'com.google.gms:google-services:4.4.4'apps/mobile/android/app/build.gradle: tingimuslikapply plugin: 'com.google.gms.google-services'Käsitsi muudatusi vaja pole — mõlemad failid on kommititud.
- Firebase → Project Settings → Service accounts → "Generate new
private key", lae JSON alla ja salvesta Cloudflare'i:
wrangler secret put FCM_SERVICE_ACCOUNT_JSON < firebase-adminsdk.json. - Serveri pool:
dispatchPush(apps/web/server/utils/notify.ts) allkirjastab teenusekonto põhjal RS256 JWT-icrypto.subtleabil, vahetab selle OAuth2 ligipääsutoken'i vastu ja POST-ibhttps://fcm.googleapis.com/v1/projects/<project-id>/messages:sendiga Androidi (ja FCM-iga ühendatud iOS) tunnuse kohta. Aegunud tunnused (HTTP 404 /UNREGISTERED) revokeeritakse automaatselt tabelisdevice_tokens, et lõpetada uuesti proovimine.
11.3 Apple Push Notification service (iOS)
- Apple Developer portaalis luba Push Notifications võimekus App
ID-l
ee.skillhub.app. Avaapps/mobile/ios/App/App.xcworkspace, vali App-i sihtmärk → Signing & Capabilities → "+ Capability" → Push Notifications. - Loo APNs autentimisvõti (Keys → "+", märgista "Apple Push
Notifications service", lae alla
.p8). Märgi Key ID ja Team ID — mõlemat on vaja. - Salvesta tunnustused Cloudflare'i saladustena:
Lisawrangler secret put APNS_AUTH_KEY_P8 < AuthKey_XXXX.p8 wrangler secret put APNS_KEY_ID # 10-tähemärgiline sõne wrangler secret put APNS_TEAM_ID # 10-tähemärgiline sõne wrangler secret put APNS_BUNDLE_ID # ee.skillhub.appAPNS_USE_SANDBOX=1TestFlighti/Xcode'i koostudele; eemalda (või0) tootmise jaoks. - Serveri pool: failis
dispatchPushallkirjasta JWT (ES256, päised{ alg: "ES256", kid: APNS_KEY_ID }, kasulik koormus{ iss: APNS_TEAM_ID, iat }) ja POST-i aadressilehttps://api.sandbox.push.apple.com/3/device/<token>(liivakast) võihttps://api.push.apple.com/3/device/<token>(tootmine), peadapns-topic: ee.skillhub.appja teate tekstiga.
11.4 Veebi push (Nuxt PWA, valikuline)
Kui soovid lauatööandjatele brauseri push'i, paigalda workeri sisse
web-push, genereeri VAPID võtmepaar
(npx web-push generate-vapid-keys) ja salvesta võtmed Cloudflare'i
saladustena VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY. Telli brauseris
navigator.serviceWorker.register(...).pushManager.subscribe kaudu ja
POST-i PushSubscription JSON aadressile /api/me/device-tokens
parameetriga platform: 'web'. dispatchPush kutsub seejärel iga
web rea kohta webpush.sendNotification-it.
11.5 Otsast otsani kontrollimine
- Logi sisse päris seadmel (iOS Simulator EI saa APNS-i).
- Käivita töövõtu päringu POST oma konto vastu teisest sessioonist.
- Kontrolli
wrangler tail apps/web— kuiFCM_SERVICE_ACCOUNT_JSONon seatud, ei tohiks ühtegi(stub)rida ilmuda; tõrked tulevad välja kujul[notify] FCM send failedkoos v1 vea kerega. - Märk / salve sissekanne peaks ilmuma sekundi-paari jooksul.
Kuni §11 on töös, on rakendusesisene /api/me/notifications voog
ainus tõe allikas töövõtu päringu hoiatuste jaoks ja töölise avalehe
küsib neid igal laadimisel.