Nous avions des exigences similaires sur le dernier projet : Un backend GAE avec un frontend GWT et des clients Android/iPhone. En outre, nous ne voulions pas stocker les informations d'identification des utilisateurs.
Nous avons donc choisi d'utiliser OpenID, qui est malheureusement une norme Web et ne fonctionne pas bien avec les appareils mobiles, mais qui est faisable.
Du côté de GAE, nous avons simplement activé la connexion fédérée qui nous a donné OpenID.
Sur les appareils mobiles, lorsque l'utilisateur doit se connecter, nous lui présentons une liste d'authentificateurs OpenID (Google, Yahoo, etc.). Ensuite, nous ouvrons un navigateur natif (pas un navigateur intégré) et dirigeons l'utilisateur vers le site d'authentification OpenID choisi. L'avantage est que le navigateur de l'utilisateur a généralement déjà mémorisé le nom d'utilisateur et le mot de passe, de sorte que l'utilisateur n'a plus qu'à appuyer sur un bouton.
Tout cela est assez simple. Maintenant, voici la partie délicate : Après que l'utilisateur ait confirmé sa connexion, OpenID redirige vers notre url de retour GAE (vous devez fournir cette url lorsque la demande est faite). Sur cette URL, nous créons une URL personnalisée, par exemple :
yourappname://usrname#XXXYYYZZZ
où XXXYYYZZZZ est le jeton d'authentification. Nous obtenons ce jeton à partir de la page de retour où il est stocké comme un cookie ACSID : nous avons utilisé une JSP pour lire ce cookie et l'intégrer dans l'URL personnalisée ci-dessus.
Ensuite, nous enregistrons nos applications Android et iPhone pour qu'elles gèrent l'accès à l'information. yourappname://
Ainsi, lorsque l'utilisateur clique sur ce lien, notre application est invoquée et le lien lui est transmis. Nous extrayons le nom de l'utilisateur et le jeton de ce lien et nous les utilisons dans les requêtes REST vers le backend GAE.
Si vous avez d'autres questions, je me ferai un plaisir de mettre à jour cet article.
Mise à jour :
Le cookie de session de l'utilisateur sur l'AppEngine de production est nommé ACSID
tandis que sur le serveur AppEngine de développement, il est nommé dev_appserver_login
.