2

Je suis en train de construire un backend Google Cloud Endpoints avec la bibliothèque endpoints-proto-datastore, et je rencontre des problèmes nécessitant une apicaly lorsque vous demandez un utilisateur. Une fois qu'un utilisateur se connecte, il reçoit une clé API qu'il renvoie pour des mises successives (ce qui fonctionne) mais comment puis-je demander le nom d'utilisateur/email et apikey sur un GET? Actuellement, si un utilisateur fait un get comme ceci:Comment puis-je exiger un champ api-token sur les demandes?

@User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get') 
def user_get(self, query): 
    return query 

L'utilisateur est tiré du datastore, car l'ID est correct, et il ignore complètement le apiToken. Comment puis-je avoir besoin des deux champs? (sur une note différente, comment renvoyer l'ID de l'utilisateur sur une demande?)

Répondre

1

La meilleure façon que je trouve à faire est la suivante:

@User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get') 
def user_get(self, user_model): 
    user = ndb.Key('User', int(user_model.id)).get() 
    if user.apiToken != user_model.apiToken: 
     raise endpoints.UnauthorizedException('You are not authorized to view this data') 
    return user.clean() 

Le user_model aura le userId et la apiToken qui y sont stockées, donc j'extraire les données « réelles » de NDB avec la clé et vérifier si le user_model a le bon jeton et renvoie le modèle s'il est correct, sinon je refuse

1

Si vous implémentez votre propre schéma de clé API, comme votre code le suggère, vous devez vérifier manuellement si la clé API est valide ou pas vous-même. Votre exemple ressemble à celui de l'exemple 'basic' et vous avez ajouté des paramètres selon l'exemple 'simple_get'. Pour un peu d'arrière-plan, les docs de l'exemple 'simple_get' mentionnent que 'id' est l'une des cinq propriétés d'aide spéciales définies automatiquement par EndpointsModel pour des opérations courantes telles que la récupération par id. C'est pourquoi votre code fonctionne automatiquement sans que vous fassiez quelque chose de 'spécial' avec le paramètre 'id'. L'exemple vérifie encore si que l'entité existe si vous essayez de l'obtenir:

if not my_model.from_datastore: 
     raise endpoints.NotFoundException('MyModel not found.') 

Comme il n'y a pas de propriété d'aide spéciale pour votre champ « apiKey », vous devez ajouter votre propre code dans la méthode pour vérifier si la La clé est valide et renvoie une erreur 401 ou appropriée si ce n'est pas le cas. Une autre option consiste à utiliser également une partie de l'authentification intégrée de Google selon l'exemple 'basic_with_auth'. Enfin, comme les points de terminaison-proto-datastore ne sont que du sucre syntaxique pour la bibliothèque principale des points de terminaison, vous devez lire le full documentation pour plus d'informations sur la façon de renvoyer des valeurs de vos méthodes de point de terminaison.

+0

Je n'arrive pas à comprendre comment accéder à l'apiToken (à partir de la requête) maintenant pour le comparer au jeton du modèle. Comment lire les informations de demande? Je fais probablement tout faux, mais par exemple, mise à jour, l'utilisateur créé par proto points de terminaison est un doublon de l'utilisateur dans le magasin de données, donc je peux le comparer à celui enregistré. – Asitaka