30 votes

Informations d'identification du service Web - OpenID/Android AccountManager ?

Je suis en train de construire un webservice et j'aimerais utiliser les informations d'identification du compte google de l'utilisateur.

Le service fonctionne sur GAE et disposera d'un client web et d'un client natif Android.

C'est la première fois que je tente de réaliser quelque chose de ce genre et j'ai lu des articles sur OpenID et la bibliothèque Android AccountManager.

Je ne sais toujours pas quelles sont mes options en termes de stockage des utilisateurs dans mon Datastore. Quel identifiant dois-je utiliser ? Est-il possible d'utiliser OpenID sur une application Android native ?

Toute aide et/ou indication serait appréciée. Merci.

30voto

Peter Knego Points 57985

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 .

12voto

Igor Zubchenok Points 315

J'ai passé environ une semaine à trouver un moyen approprié et moderne pour cela - sans navigateur web et en utilisant le gestionnaire de compte Android.

Si vous souhaitez utiliser le compte Google et AccountManager pour identifier l'utilisateur, vous pouvez le faire :

  1. Obtenir son jeton d'authentification à Google Contacts (le type de jeton d'authentification est "cp") par l'intermédiaire de AccountManager on arrière-plan fil :

    public String getUserToken(Activity activity)
    {
        AccountManager accountManager = AccountManager.get(activity);
        AccountManagerFuture<Bundle> amf = accountManager.getAuthTokenByFeatures("com.google", "cp", null, activity, Bundle.EMPTY, Bundle.EMPTY, null, null );
    
        Bundle bundle = null;
        try {
            bundle = amf.getResult();
            String name = (String) bundle.get(AccountManager.KEY_ACCOUNT_NAME);
            String type = (String) bundle.get(AccountManager.KEY_ACCOUNT_TYPE);
            String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
            return token;
        } catch (OperationCanceledException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            e.printStackTrace();
        }
        return null;
    }
  2. Transmettre le UserToken reçu au serveur via sécurisé canal.

  3. Valider le jeton au serveur par google en utilisant la bibliothèque gdata ( Bibliothèque Google Data API ) :

    public String getUserId(String token)
    {
        ContactsService contactsService = new ContactsService("Taxi");
        contactsService.setUserToken(token);
    
        IFeed feed = null;
        try {
            feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000"), ContactFeed.class);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    
        if (feed == null)
            return null;
    
        String externalId = feed.getId();
        IPerson person = feed.getAuthors().get(0);
        String email = person.getEmail();
        String name = person.getName();
        String nameLang = person.getNameLang();
    
        return externalId;
    }
  4. Le jeton Google peut expirer (généralement au bout d'une heure). Si vous n'avez pas réussi à valider le jeton sur le serveur, vous devez renvoyer la réponse au client, invalider le jeton et en obtenir un nouveau. Utilisez le gestionnaire de compte pour invalider le jeton :

    public void invalidateUserToken(Context context, String token)
    {
        AccountManager accountManager = AccountManager.get(context);
        accountManager.invalidateAuthToken("com.google", token);
    }

3voto

thomas88wp Points 801

Creo que este Cet article de blog fait exactement ce que vous voulez. Cela a fonctionné pour moi. Les deux solutions proposées ici sont viables et intelligentes, mais je pense que celle-ci répond exactement à la demande de l'auteur.

Essentiellement, vous obtenez simplement un authToken en utilisant la portée "ah", et vous le passez à la bonne page web pour obtenir le cookie ACSID qui vous permettra d'accéder à toute page AppEngine qui utilise UserService pour l'authentification.

0voto

fmo Points 595

http://developer.Android.com/search.html#q=AccountManager&t=0

http://developer.Android.com/resources/samples/SampleSyncAdapter/index.html au bas de cette page, vous trouverez tous les codes nécessaires.

meilleures salutations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X