2

Je dois vérifier que j'ai ce droit. Je construis une action sur Google en utilisant le SDK Actions. Pour l'authentification, je souhaite utiliser Google Sign In pour que tout soit relativement simple pour l'utilisateur final. Mon accomplissement sera assis sur les fonctions Firebase. Mon serveur OAUTH sera installé en dehors de Firebase.Actions sur Google - Connexion et échange de jeton d'accès pour UID

La première chose que je note est que la plupart de la connexion frontale se fait en JavaScript.

var provider = new firebase.auth.GoogleAuthProvider();

De là, si l'utilisateur ouvre une session, nous pouvons utiliser:

firebase.auth().getRedirectResult().then(function(result) { } et nous avons accès à result.user.uid

Ma première question ici est la sécurité - parce que le API Key, DatabaseURL et authDomain sont exposées dans JavaScript côté client et, à l'aide d'une Developer Console dans Chrome, l'utilisateur final a accès à son ID et à son jeton. Je me demandais si utiliser le jeton uid ou id sous result.user.De pour une raison quelconque, mais comme il semble que vous pouvez facilement utiliser un décodeur JWT sur Internet pour extraire toutes les informations de sorte qu'il rend vraiment peu différent d'un point de vue de sécurité - je peut aussi prendre l'uid ici.

Il semble que le côté administrateur des choses est disponible dans Node.js et PHP où je peux me connecter à la base de données et valider les jetons et créer des utilisateurs, mais je ne peux pas me connecter. Donc JavaScript semble le chemin à parcourir. La prochaine étape, je pense, est de renvoyer mon uid sur le serveur oauth pour que nous sachions à qui nous ouvrons une session et que nous puissions lier le jeton d'accès oauth/rafraîchir le jeton/code d'authentification à l'uid. Et que nous stockions ce lien dans Firebase ou une base de données MySQL sur le serveur Oauth, cela n'a pas vraiment d'importance.

Puis pour l'accomplissement dans les fonctions Firebase, nous avons alors une userId par:

let ActionsSdkApp = require('actions-on-google').ActionsSdkApp; 
const app = new ActionsSdkApp({request: request, response: response}); 
app.getUser().userId); 

Mais cela ne correspond pas à l'uid nous avons récupéré à partir du résultat ... Mais nous avons accès à la AccessToken nous avons produit sur le serveur Oauth, nous avons donc besoin d'échanger le jeton d'accès pour l'uid correct - que nous cherchions à partir de Firebase ou du serveur MySQL OAuth, je suppose que cela n'a pas d'importance.

Si tout est réuni, est-ce que tout sonne correctement? Ou y a-t-il quelque chose qui pourrait être mieux fait? J'espérais qu'il y avait une meilleure façon d'identifier l'utilisateur dans Firebase Functions. Mais cela ne semble pas possible.

Répondre

2

Je pense que vous avez la plupart du temps correct (en supposant que je suis tout), mais quelques points à noter:

  1. Vous devriez pas envoyer juste le code d'utilisateur du client à votre serveur.

    Comme vous l'avez remarqué, cette information est facilement disponible pour ... eh bien ... n'importe qui. Cela signifie que, à moins que vous soyez prudent, n'importe qui pourrait simplement envoyer à votre serveur un UserID obtenu ailleurs et prétendre être vous. L'utilisation du jeton JWT offre un peu plus de sécurité. Bien qu'il contienne l'ID utilisateur, il contient également un hachage signé de cette information, ce qui vous permet de vérifier que l'information est valide. Il contient également une expiration, vous pouvez donc le rejeter s'il se situe en dehors de la plage de validité.Cela rend beaucoup plus difficile pour quelqu'un de forger un identifiant d'utilisateur ou de réutiliser celui qu'il a acquis.

    Vous devriez également prendre d'autres précautions dans ce sens. Nous ne pouvons pas vraiment faire confiance au navigateur, mais nous pouvons réduire la possibilité de problèmes.

  2. Vous avez raison, l'ID utilisateur envoyé par l'Assistant n'a aucun lien avec un autre ID utilisateur. Il est destiné à servir de référence de type cookie anonyme, de sorte que vous savez si vous obtenez le même UserID deux fois ... la personne à l'autre extrémité est probablement la même. Il est principalement destiné à un usage simple et non à une véritable authentification, et certainement pas à une autorisation. C'est pourquoi la procédure de liaison de compte, votre serveur OAuth, et de vous remettre un jeton d'authentification est si important si vous voulez faire l'authentification et l'autorisation. Vous avez cette partie correcte - vous devez vérifier que le jeton est valide (pour aider à réduire le risque que quelqu'un d'autre ne prétende pas être l'assistant) et l'utiliser pour déterminer l'ID.

    La recherche dans une base de données est une option, mais l'émission d'un jeton comme JWT est une autre option. Compte tenu de la configuration que vous décrivez, la gestion dans un magasin de données est la plus logique.

+0

Merci Prisonnier! Il m'a fallu longtemps pour envelopper ma tête, mais j'arrive lentement. Donc, au lieu d'utiliser l'id_utilisateur, je peux à la place passer l'idToken en utilisant peut-être Post à un script PHP backend qui peut faire la validation JWT et stocker les Tokens générés et Id utilisateur décodé. – Simon