Credo che questo non sia possibile in un modo sicuro, sfortunatamente. Lasciami spiegare perché.
Vuoi che la tua app di frontend abbia un modo per identificarsi con l'API. In altre parole, vuoi l'autenticazione.
Ma l'autenticazione richiede l'esistenza di qualche tipo di dati segreti unici che l'applicazione front-end può utilizzare per distinguersi dalle altre applicazioni. Questo può essere un segreto condiviso (password, "chiave API"), una chiave crittografica privata asimmetrica o qualcos'altro ancora. Ma qualunque esso sia, deve rimanere un segreto, poiché se un'altra app può copiarlo, può passare come app di frontend.
Quindi la domanda è: dove hai intenzione di memorizzare quel segreto?
Se è memorizzato all'interno del codice dell'applicazione stesso o direttamente accessibile, è vulnerabile al reverse engineering o agli exploit nell'app di front-end, indipendentemente dal numero di livelli di riferimento indiretto crittografico che si utilizzano per nasconderlo. Questo è il difetto di sicurezza fondamentale che ha portato al fallimento di quasi tutti i regimi di DRM inventati fino ad oggi.
Se è memorizzato in una posizione a prova di manomissione della macchina client (ad esempio, chip TPM, sistema di gestione delle chiavi del sistema operativo affidabile), allora la domanda diventa, come ci si arriva inizialmente? E come hai intenzione di accedervi dal codice Javascript, che ha limitate capacità di accesso al SO di basso livello?
Se è memorizzato in remoto, stai solo spostando il problema dell'autenticazione delle app altrove: in che modo la tua app di front-end procederà all'autenticazione sul server remoto? O in altre parole, cosa impedisce ad un'altra app di accedere a quel server remoto esattamente nello stesso modo?
La mia conclusione è che non esiste un modo veramente sicuro per autenticare un pezzo di software JS. Dovrai progettare la tua API in un modo che sia sicuro dall'input del client malevolo e, se vuoi comunque un modo per escludere i client compromessi, fornire ai client "chiavi API" revocabili che puoi facilmente escludere dal lato server, il modo in cui la maggior parte dei servizi Web (e dei nuovi DRM) lo fanno.