7

Ich versuche, aus heute Google Cloud-Funktionen nach dieser Anleitung: https://cloud.google.com/functions/docs/quickstartSichere Google Cloud Funktionen http-Trigger mit Auth

ich eine Funktion mit einem HTTP-Trigger erstellt und konnte eine POST-Anforderung auszuführen, um eine Funktion auszulösen, um Schreib in den Datenspeicher.

Ich frage mich, ob es eine Möglichkeit gibt, diesen HTTP-Endpunkt zu sichern? Momentan scheint es eine Anfrage von irgendwoher/irgendjemand anzunehmen.

Beim googeln, sehe ich die meisten Ergebnisse über die Sicherung von Dingen mit Firebase. Allerdings verwende ich den Firebase-Dienst hier nicht.

Würden meine Optionen entweder offen sein und hoffen, dass niemand den URL-Endpunkt kennt (Sicherheit durch Obskurität), oder implementiere meine eigene Berechtigungsprüfung in der Funktion selbst?

+0

Ich habe die gleiche Frage! –

+0

Ich habe das gleiche Problem! – Neurus

+0

Ich hatte auch die gleichen Zweifel. AWS API Gateway hat ein Konzept von API-Schlüssel.Gibt es etwas ähnliches in GCP? – unnik

Antwort

3

Nachdem ich weiter gegangen bin und einen Hinweis aus der @ ricka-Antwort genommen habe, habe ich beschlossen, eine Authentifizierungsprüfung für meine Cloud-Funktionen mit einem JWT-Token in Form eines Berechtigungs-Header-Zugriffstokens durchzuführen.

Hier ist die Implementierung in Knoten:

const client = jwksClient({ 
    cache: true, 
    rateLimit: true, 
    jwksRequestsPerMinute: 5, 
    jwksUri: "https://<auth0-account>.auth0.com/.well-known/jwks.json" 
}); 

function verifyToken(token, cb) { 
    let decodedToken; 
    try { 
    decodedToken = jwt.decode(token, {complete: true}); 
    } catch (e) { 
    console.error(e); 
    cb(e); 
    return; 
    } 
    client.getSigningKey(decodedToken.header.kid, function (err, key) { 
    if (err) { 
     console.error(err); 
     cb(err); 
     return; 
    } 
    const signingKey = key.publicKey || key.rsaPublicKey; 
    jwt.verify(token, signingKey, function (err, decoded) { 
     if (err) { 
     console.error(err); 
     cb(err); 
     return 
     } 
     console.log(decoded); 
     cb(null, decoded); 
    }); 
    }); 
} 

function checkAuth (fn) { 
    return function (req, res) { 
    if (!req.headers || !req.headers.authorization) { 
     res.status(401).send('No authorization token found.'); 
     return; 
    } 
    const parts = req.headers.authorization.split(' '); 
    if (parts.length != 2) { 
     res.status(401).send('Bad credential format.'); 
     return; 
    } 
    const scheme = parts[0]; 
    const credentials = parts[1]; 

    if (!/^Bearer$/i.test(scheme)) { 
     res.status(401).send('Bad credential format.'); 
     return; 
    } 
    verifyToken(credentials, function (err) { 
     if (err) { 
     res.status(401).send('Invalid token'); 
     return; 
     } 
     fn(req, res); 
    }); 
    }; 
} 

I jsonwebtoken verwenden, um die JWT-Token, um zu überprüfen, und jwks-rsa den öffentlichen Schlüssel abzurufen. Ich benutze Aut0, also jwks-rsa greift auf die Liste der öffentlichen Schlüssel, um sie abzurufen.

Die checkAuth Funktion kann dann die Cloud-Funktion zur Sicherung verwendet werden, wie:

exports.get = checkAuth(function (req, res) { 
    // do things safely here 
}); 

Sie diese Änderung

Der JWT/Zugriffstoken in einem abgerufen werden kann https://github.com/tnguyen14/functions-datastore/commit/a6b32704f0b0a50cd719df8c1239f993ef74dab6 auf meinem GitHub Repo sehen Anzahl der Weg. Für Auth0 kann die API doc bei https://auth0.com/docs/api/authentication#authorize-client

gefunden werden Sobald diese vorhanden ist, können Sie die Cloud-Funktion auslösen mit so etwas wie

curl -X POST -H "Content-Type: application/json" \ 
-H "Authorization: Bearer access-token" \ 
-d '{"foo": "bar"}' \ 
"https://<cloud-function-endpoint>.cloudfunctions.net/get" 
0

Es scheint, als gäbe es derzeit zwei Möglichkeiten, einen Google Cloud Function HTTP-Endpunkt zu sichern.

1) Verwenden Sie eine harte Funktionsnamen (ex zu erraten: my-Funktion-vrf55m6f5Dvkrerytf35)

2) Überprüfen Sie, ob das Kennwort/Credentials/signed-Anforderung innerhalb der Funktion selbst (mit einem Kopf- oder Parameter)

Wahrscheinlich am besten beide zu tun.

+0

Ja, es scheint, dass die Authentifizierung etwas ist, das innerhalb der Funktion selbst überprüft werden muss. –

1

Sie (wenn Sie Ihre mit http-Trigger aktiviert ist), sollte nicht "Lass es offen und hoffe niemand weiß es". Sie können Ihren eigenen Sicherheitscheck implementieren oder das Google Function Authorizer-Modul (https://www.npmjs.com/package/google-function-authorizer) ausprobieren.

[Bearbeitet wegen moderatrolling].

Verwandte Themen