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é
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 .
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
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
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
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
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?
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
(...) 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
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