1

Dans le but d'en apprendre davantage sur les points de terminaison, je construis une application appelée "Où es-tu?". L'application permet aux utilisateurs de demander l'emplacement d'autres utilisateurs. L'idée est de le faire en laissant l'utilisateur sélectionner un contact, rechercher le contact par numéro de téléphone dans mon point de terminaison. Si trouvé, cela signifie que le contact a l'application et GCM est envoyé en demandant l'emplacement. Si le contact n'est pas trouvé, un SMS est envoyé avec une URL qui demandera l'emplacement via un navigateur, exécutera un message http de cet emplacement et demandera au serveur GCM de le renvoyer à la personne demandant l'emplacement.Quelle est la meilleure façon d'authentifier, d'identifier et de stocker des informations délicates sur les utilisateurs?

J'ai besoin d'authentifier les utilisateurs de l'application et de stocker les numéros de téléphone de plusieurs contacts ainsi que les utilisateurs de l'application. A partir de maintenant, je vais principalement me concentrer sur le côté serveur des choses.

Comment puis-je archiver les éléments ci-dessus en toute sécurité?

Jusqu'ici j'active OAuth 2.0 pour mon API et je passe le user_required=True comme argument à mon décorateur Model.method. Il en résulte le code suivant:

from google.appengine.ext import endpoints 
from google.appengine.ext import ndb 
from protorpc import remote 
from endpoints_proto_datastore.ndb import EndpointsModel 

class User(EndpointsModel): 
    owner = ndb.UserProperty() 
    phone_number = ndb.StringProperty() 
    reg_id = ndb.StringProperty() 
    created = ndb.DateTimeProperty(auto_now_add=True) 

@endpoints.api(name='whereareyoudroid', version='v1', 
       description='Where Are You Users') 
class UserApi(remote.Service): 
    @User.method(user_required=True, 
       response_fields=('id',), 
       path='user') 
    def insert(self, user): 
     user.owner = endpoints.get_current_user() 
     user.put() 
     return user 

    @User.method(user_required=True, 
       request_fields=('id',), 
       path='user/{id}', 
       http_method='GET') 
    def get(self, user): 
     if not user.from_datastore: 
      raise endpoints.NotFoundException('User not found.') 
     return user 

Mais le code ci-dessus ne nécessite qu'un compte gmail valide. Je pense à quelque chose où vous ne pouvez accéder à un utilisateur si vous avez déjà le numéro de téléphone? Ce qui serait le cas si je limitais les champs de réponse sur la méthode get pour exclure le numéro de téléphone ... à moins que quelqu'un décide de forcer le service par force. Suggestions? Commentaires?

De this Je comprends que je peux configurer mon point de terminaison pour accepter uniquement les demandes de mes applications. Est-ce correct? Et si oui, quelqu'un ne pourrait-il pas extraire l'information nécessaire de l'apk ou la modifier pour accomplir ... le mal? :)

Mise à jour: si trouvé

  1. A fait une demande pour l'emplacement de B

    point final Interroge par numéro de téléphone si pas envoyer trouvé simplement une demande par SMS ... aller à 2 .

  2. demande est transmise à l'application GAE

    Cela se fait par l'insertion d'un point de terminaison emplacement id whoes est un UUID et envoie un GCM à B à propos de la demande

  3. app GAE vérifie que ID secret A est sur la liste blanche de B

    Il n'y a pas de liste blanche et l'identifiant secret est l'UUID si cette étape est éliminée

  4. l'application puis les requêtes pour l'emplacement de B

    Si B décide d'accorder l'accès à son emplacement B met à jour simplement le point final de localisation basé sur l'UUID

  5. Une fois l'application récupère ces informations, il vérifie alors qu'il envoie ces informations que pour l'utilisateur identifié par ID secret a

    Lorsque B met à jour son emplacement GAE envoie un GCM à a informer sur la mise à jour

  6. l'information est ensuite envoyée en toute sécurité au client de a

    Fait! GCM et SMS (et HTTPS) peuvent être considérés comme sécurisés ... non?

    Mise à jour: GCM n'est pas sécurisé ... mais est-ce vraiment important?

+1

d'après votre description, il ne semble pas comme il n'y a aucun contrôle d'accès, à savoir si je connais le nom de quelqu'un et rechercher leur numéro de téléphone, je peut interroger où ils sont tant que j'ai un compte avec vous (qu'ils aiment que je fais t chapeau ou non). Si c'est le cas, je ne m'inquiéterais pas beaucoup de la sécurité d'OAuth, c'est assez bon (parce que le problème de sécurité est ailleurs). Si vous avez seulement oublié de mentionner ce détail, mes excuses. Dans ce cas, j'authentifierais personnellement les utilisateurs avec la cryptographie à clé publique, puisque c'est la manière la plus sûre possible (...) – Damon

+1

(...) bien que OAuth soit "assez bon" pour des millions de personnes, mais personnellement je n'aime pas le idée de donner la sécurité à une autre partie inconnue (ce qui est essentiellement ce que vous faites). Les mots de passe hachés sont de plus en plus gênants, et des choses comme bcrypt ne sont pas vraiment efficaces (par rapport au coût). Générer une clé publique à partir d'une clé secrète (mot de passe haché, si vous voulez) est raisonnablement efficace (pensez à curve25519) et ne doit être fait que rarement. La clé publique stockée dans votre base de données est sans valeur même si elle est divulguée/volée, et contrairement à un hachage non brutalement forcé. – Damon

+0

Il n'y aura pas de mots de passe que j'ai l'intention d'auth avec google ... au moins c'est ce que je pense que je vais. – user672009

Répondre

3

Vous souhaitez acquérir une combinaison d'informations assez sensible: adresse électronique de l'utilisateur (en tant qu'identité), numéro de téléphone et emplacement.

Donc tout d'abord, vous devrez être très prendre en compte les questions de confidentialité pour les utilisateurs, avoir une politique sur la façon dont ces informations sont stockées et distribuées et faire clairement comprendre aux utilisateurs ce qu'ils autorisent. Je suggère de ne pas stocker tout agrégat de ce type de jeu de données dans le client, dans la mesure du possible. A cet effet, je recommande d'utiliser le stockage GAE autant que possible.

Votre application interrogeant l'emplacement d'un utilisateur ne devrait pas être trop inquiétante, à condition que les choses soient faites sur des canaux sécurisés bien conservés.

Ce qui est inquiétant, c'est que cette information n'atteint qu'une source autorisée. C'est-à-dire que seul un contact mutuel peut demander cette information.

Je suggère que pour chaque utilisateur, une liste blanche des contacts autorisés serait la meilleure. Pour chaque utilisateur, ayez un UUID secret secret associé (qui ne sort jamais à aucun client) sur GAE. Un utilisateur s'inscrivant à votre service créerait cet identifiant. La liste blanche consisterait alors en une liste d'identifiants secrets.

Un processus pourrait alors être-

  1. A fait la demande pour l'emplacement de B
  2. demande est transmise à l'application GAE.
  3. app GAE vérifie que ID secret A est sur la liste blanche de B
  4. L'application puis des requêtes pour l'emplacement de B
  5. Une fois que l'application récupère ces informations, il vérifie alors qu'il envoie ces informations uniquement à l'utilisateur identifié par des A ID secrète
  6. L'information est ensuite envoyée en toute sécurité au client de A
+0

Votre processus est assez proche de ce que j'avais en tête. Tu m'as fait réaliser que les identifiants devaient être non séquentiels et non devinables. J'ai mis à jour ma question en fonction de votre réponse. – user672009

Questions connexes