2010-09-08 4 views
4

Je construis une Webapp qui utilise OpenId pour authentifier les utilisateurs, comme le fait Stackoverlfow. Il y aura également une application mobile, par ex. Android ou iPhone. Ces applications doivent s'authentifier ou se connecter d'une manière ou d'une autre, pour accéder aux données et mettre à jour les éléments qui appartiennent à l'utilisateur. Puisqu'il n'y a aucun nom d'utilisateur et mot de passe que l'on pourrait fournir pour authentifier l'appareil mobile, je me demande comment y parvenir.Comment authentifier une application mobile sans nom d'utilisateur et mot de passe?

Deux façons sont venus à l'esprit:

  1. Générez une clé sur le serveur qui doit être entré sur l'appareil. Cette clé sera envoyée en tant que clé d'authentification lorsque le périphérique mobile envoie ou demande des données et que l'utilisateur peut être lié de cette manière. Lors de l'utilisation de cette option, la clé doit être transportée d'une manière ou d'une autre à l'utilisateur, afin qu'il n'ait pas à la saisir. Peut-être par courriel, SMS ou en scannant un code à barres. L'application mobile utilise le navigateur ou affiche un panneau Web intégré qui ouvre une page spéciale de la Webapp. Sur cette page, l'utilisateur doit se connecter et permettre à l'application mobile de lire et d'écrire des données.

Ma question est: Est-ce que les deux façons sont possibles et économisent? Lequel préfèrerais tu? Quels sont les détails à surveiller? Y a-t-il d'autres moyens de le faire? Si tout va bien, il ne serait pas possible d'utiliser OpenId sur le périphérique, et de lier le mobile et la webapp de cette façon, non?

+0

@CommonsWare: Je vais jeter un oeil à ce sujet. –

+0

@CommonsWare: ressemble à vous suggérant la même chose que @ Nic-Strong, non? Je ne comprends pas comment cela pourrait fonctionner, voir mon commentaire ci-dessous. –

Répondre

4

Je l'ai fait ce qui suit pour y parvenir:

  • Lorsque la première application démarre, je teste si il y a un jeton d'authentification et si elle est toujours valide
  • Sinon, j'utilise [ startActivityForResult] [1] pour ouvrir mon activité de connexion
  • LoginActivity utilise un WebView et ouvre la page "Authentifier l'application" (par exemple https://www.yourdomain.com/authapp) de l'application Web.
  • Si l'utilisateur n'est pas connecté à la webapp, il doit le faire maintenant. En cas de connexion réussie, il est redirigé vers la page "Authentifier l'application"
  • La page "Authentifier l'application" contient le texte "Voulez-vous que l'application mobile accède à vos données" et un bouton "Accorder" et "Annuler".
  • Si l'utilisateur clique sur « subvention » l'application Web generats un jeton d'authentification, écrit à la databse et redirige vers une page de réponse, la fixation du jeton d'authentification généré à l'URL (par exemple https://www.yourdomain.com/authresponse?auth_token=dshf84z4388f4h)
  • Les extraits d'applications mobiles le jeton de l'URL et l'utilise pour l'authentification lorsque vous parlez au serveur.

    L'activité de WebLogin ressemble à ceci: (note: vous devez remplacer « shouldOverrideUrlLoading » pour rester dans le même WebView Sinon, un nouveau navigateur est ouvert lorsque vous recevez une redirection.)

    WebLogin public class étend l'activité {

    @Override protected void onCreate (groupe savedInstanceState) { super.onCreate (savedInstanceState);

    WebView webview = new WebView(this); 
    webview.setWebViewClient(new WebViewClient() { 
    
        @Override 
        public boolean shouldOverrideUrlLoading(WebView view, String url){ 
         view.loadUrl(url); 
         return true; 
        } 
    
        @Override 
        public void onPageFinished(WebView view, String url) { 
    
         if(StringUtils.contains(url, "?auth_token=")){ 
    
          // extract and save token here 
    
          setResult(RESULT_OK); 
          finish(); 
         } 
        } 
    }); 
    
    webview.loadUrl("https://www.yourdomain.com/authapp"); 
    webview.getSettings().setJavaScriptEnabled(true); 
    setContentView(webview); 
    

    }}

Remarque, j'utilise le protocole HTTPS pour faire de cette sauvegarde. Si vous utilisez http simple, on pourrait lire et voler le jeton d'un utilisateur.

[1]: http://developer.android.com/reference/android/app/Activity.html#startActivityForResult(android.content.Intent, int)

+0

C'est essentiellement comme cela que je l'ai fait. J'ai utilisé une méthode REST et renvoyé le jeton d'authentification à l'application native. L'application native stocke le jeton et transmet le jeton en tant que paramètre à mes autres méthodes REST. J'ai une méthode de vérification qui est appelée pour chaque méthode REST et vérifie le jeton d'authentification. Je ne sais pas si c'était la bonne façon de le faire, mais ça marche! –

0

La spécification OAuth actuelle (RFC5849) requiert toujours que l'utilisateur entre ses informations d'identification sur le site Web qui contient la ressource protégée. Sur une application mobile, cette expérience utilisateur n'est pas la meilleure (comme vous l'avez souligné, l'application mobile doit afficher la page d'authentification avec une vue Web intégrée). OAuth 2.0 résout ce problème en spécifiant différents types de Grant d'accès. Cette norme est toujours en projet. Jusque-là, votre meilleur pari est probablement de modifier les flux d'OAuth 1.0 pour les adapter à un appareil mobile comme le font déjà un certain nombre de sites importants (par exemple Twitter avec xAuth et Dropbox avec leur).

+0

Je ne comprends pas. Vous suggérez que mon application web fournisse un mécanisme d'authentification tel que xAuth de Twitter? Si je comprends bien, xAuth de twitter demande un nom d'utilisateur et un mot de passe et vous donne un auth_token en échange. L'avantage est que votre application mobile ne stocke pas le nom d'utilisateur et le mot de passe. Cependant, mon application web ne stocke aucun nom d'utilisateur ou mot de passe, juste le jeton d'authentification que je reçois des fournisseurs openId. –

0

Je fais quelque chose de similaire à l'option (1). Créez un lien unique (ajoutez simplement l'identifiant de la session), puis envoyez-le par SMS. Il y a beaucoup de fournisseurs de SMS en vrac à bas prix avec des API simples pour le faire. Lorsque l'utilisateur clique sur l'URL dans le SMS, il ouvre le navigateur Web mobile et les connecte.

Ensuite, si le téléphone accepte les cookies, vous pouvez en définir un. Sinon, l'utilisateur devra toujours entrer via ce lien unique.

+0

Mais les cookies ne sont accessibles que par le navigateur, n'est-ce pas? Je construis une application native. –

Questions connexes