Vous êtes sur la page 1sur 7

S'authentifier auprès des services OAuth2

Sommaire :

1) Diagramme de la séquence d’authentification (OAuth) :_____________________________________1


2) Les rôles dans le protocole OAuth 2.0 :___________________________________________________2
3) Procédure d'obtention d'un jeton d'authentification valide auprès du gestionnaire de compte
Android :_______________________________________________________________________________2
4) Application :________________________________________________________________________3
a) Définitions :______________________________________________________________________________3
b) Objectifs :________________________________________________________________________________4
c) Exemple de Jeton :_________________________________________________________________________4
d) Collecter des informations :__________________________________________________________________4
e) Demander l'autorisation Internet :____________________________________________________________4
f) Demander un jeton d'authentification :________________________________________________________4
g) Connectez-vous au service en ligne :___________________________________________________________6

1) Diagramme de la séquence d’authentification (OAuth) :

1/7
2) Les rôles dans le protocole OAuth 2.0 :

3) Procédure d'obtention d'un jeton d'authentification valide auprès du


gestionnaire de compte Android :

2/7
4) Application :

a) Définitions :

OAuth 2.0, qui signifie « Open Authorization » (autorisation ouverte), est une norme conçue pour permettre
à un site Web ou à une application d'accéder aux ressources hébergées par d'autres applications Web au
nom d'un utilisateur.

Afin d'accéder en toute sécurité à un service en ligne, les utilisateurs doivent s'authentifier auprès du
service. Ils doivent fournir une preuve de leur identité. Pour une application qui accède à un service tiers, le
problème de sécurité est encore plus compliqué. Non seulement l'utilisateur doit être authentifié pour
accéder au service, mais l'application doit également être autorisée à agir au nom de l'utilisateur.

La méthode standard de l'industrie pour gérer l'authentification auprès de services tiers est le protocole
OAuth2. OAuth2 fournit une valeur unique, appelée jeton d'authentification, qui représente à la fois l'identité
de l'utilisateur et l'autorisation de l'application à agir au nom de l'utilisateur. Cette leçon montre comment
se connecter à un serveur Google prenant en charge OAuth2. Bien que les services Google soient utilisés à
titre d'exemple, les techniques démontrées fonctionneront sur tout service prenant correctement en charge
le protocole OAuth2.

b) Objectifs :

L'utilisation d'OAuth2 est utile pour :

3/7
 Obtenir l'autorisation de l'utilisateur d'accéder à un service en ligne à l'aide de son compte.
 Authentification auprès d'un service en ligne au nom de l'utilisateur.
 Gestion des erreurs d'authentification.

c) Exemple de Jeton :

Un jeton d'accès est une longue chaîne de caractères d'apparence aléatoire qui permet de vérifier les
requêtes API entrantes (un peu comme les identifiants nom d'utilisateur/mot de passe classiques).
Techniquement, le jeton est une clé qui renvoie à une collection de métadonnées de ce type :

{
  "issued_at" : "1416962591727",
  "application_name" : "0d3e1d41-a59f-4d74-957e-d4e3275d4781",
  "scope" : "A",
  "status" : "approved",
  "api_product_list" : "[scopecheck1-bs0cSuqS9y]",
  "expires_in" : "1799", //--in seconds
  "developer.email" : "scopecheck1-AdBmANhsag@apigee.com",
  "organization_id" : "0",
  "token_type" : "BearerToken",
  "client_id" : "eTtB7w5lvk3DnOZNGReBlvGvIAeAywun",
  "access_token" : "ODm47ris5AlEty8TDc1itwYPe5MW",
  "organization_name" : "wwitman",
  "refresh_token_expires_in" : "0", //--in seconds
  "refresh_count" : "0"
}

d) Collecter des informations :

Pour commencer à utiliser OAuth2, vous devez connaître quelques éléments spécifiques à l'API concernant
le service auquel vous essayez d'accéder :
 L'URL du service auquel vous souhaitez accéder.
 La portée d'authentification, qui est une chaîne qui définit le type d'accès spécifique demandé par
votre application. Par exemple, la portée d'authentification pour l'accès en lecture seule à Google
Tasks est View your tasks, tandis que la portée d'authentification pour l'accès en lecture-écriture à
Google Tasks est Manage your tasks.
 Un ID client et un secret client, qui sont des chaînes qui identifient votre application auprès du
service. Vous devez obtenir ces chaînes directement auprès du propriétaire du service. Google
dispose d'un système en libre-service pour obtenir les identifiants et les secrets des clients.

e) Demander l'autorisation Internet :

Pour les applications ciblant Android 6.0 (API niveau 23) et supérieur, la getAuthToken() méthode elle-même
ne nécessite aucune autorisation. Cependant, pour effectuer des opérations sur le jeton, vous devez ajouter
l' INTERNET autorisation à votre fichier manifeste, comme indiqué dans l'extrait de code suivant :

<manifest ... >


    <uses-permission android:name="android.permission.INTERNET" />
    ...
</manifest>

f) Demander un jeton d'authentification :

Pour obtenir le jeton, appelez AccountManager.getAuthToken().

4/7
Attention : étant donné que certaines opérations de compte peuvent impliquer une communication réseau,
la plupart des méthodes AccountManager sont asynchrones. Cela signifie qu'au lieu de faire tout votre
travail d'authentification dans une seule fonction, vous devez l'implémenter comme une série de rappels.

L'extrait de code suivant montre comment utiliser une série de rappels pour obtenir le jeton :

AccountManager am = AccountManager.get(this);
Bundle options = new Bundle();

am.getAuthToken(
    myAccount_,                       // Account retrieved using getAccountsByType()
    "Manage your tasks",     // Auth scope
    options,                           // Authenticator-specific options
    this,                             // Your activity
    new OnTokenAcquired(),           // Callback called when a token is successfully acquired
    new Handler(new OnError()));     // Callback called if an error occurs

Dans cet exemple, OnTokenAcquired est une classe qui


implémente AccountManagerCallback. AccountManager appelle run() avec OnTokenAcquired
un AccountManagerFuture qui contient un Bundle. Si l'appel a réussi, le jeton se trouve à l'intérieur du
fichier Bundle.

Voici comment vous pouvez obtenir le jeton depuis Bundle :

private class OnTokenAcquired implements AccountManagerCallback<Bundle> {


    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        // Get the result of the operation from the AccountManagerFuture.
        Bundle bundle = result.getResult();

        // The token is a named value in the bundle. The name of the value
        // is stored in the constant AccountManager.KEY_AUTHTOKEN.
        String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
        ...
  }
}

Si tout se passe bien, le Bundle contient un jeton valide dans la KEY_AUTHTOKEN clé et vous êtes prêt.

Votre première demande de jeton d'authentification peut échouer, pour plusieurs raisons :
 Une erreur dans l'appareil ou le réseau a provoqué AccountManager l'échec.
 L'utilisateur a décidé de ne pas accorder à votre application l'accès au compte.
 Les identifiants de compte stockés ne sont pas suffisants pour accéder au compte.
 Le jeton d'authentification mis en cache a expiré.

Les applications peuvent gérer les deux premiers cas de manière triviale, généralement en affichant
simplement un message d'erreur à l'utilisateur. Si le réseau est en panne ou si l'utilisateur décide de ne pas
accorder l'accès, votre application ne peut pas y faire grand-chose. Les deux derniers cas sont un peu plus
compliqués, car les applications bien comportées sont censées gérer ces pannes automatiquement.

Le troisième cas d'échec, ayant des informations d'identification insuffisantes, est communiqué via le
que Bundle vous recevez dans votre AccountManagerCallback ( OnTokenAcquired de l'exemple précédent). Si
le Bundle inclut un Intent dans la KEY_INTENT clé, l'authentificateur vous indique qu'il doit interagir
directement avec l'utilisateur avant de pouvoir vous donner un jeton valide.
Il peut y avoir de nombreuses raisons pour lesquelles l'authentificateur renvoie un fichier Intent. C'est peut-
être la première fois que l'utilisateur se connecte à ce compte. Peut-être que le compte de l'utilisateur a

5/7
expiré et qu'il doit se reconnecter, ou peut-être que ses informations d'identification stockées sont
incorrectes. Peut-être que le compte nécessite une authentification à deux facteurs ou qu'il doit activer
l'appareil photo pour effectuer une analyse de la rétine. Peu importe la raison. Si vous voulez un jeton
valide, vous devrez lancer le Intent pour l'obtenir.

private class OnTokenAcquired implements AccountManagerCallback<Bundle> {


    @Override
    public void run(AccountManagerFuture<Bundle> result) {
        ...
        Intent launch = (Intent) result.getResult().get(AccountManager.KEY_INTENT);
        if (launch != null) {
            startActivityForResult(launch, 0);
            return;
    }
  }
}

Notez que l'exemple utilise startActivityForResult(), afin que vous puissiez capturer le résultat de en Intent
implémentant onActivityResult() dans votre propre activité. Ceci est important : si vous ne capturez pas le
résultat de la réponse de l'authentificateur Intent, il est impossible de savoir si l'utilisateur s'est authentifié
avec succès.
Si le résultat est RESULT_OK, l'authentificateur a mis à jour les informations d'identification stockées afin
qu'elles soient suffisantes pour le niveau d'accès que vous avez demandé, et vous devez
rappeler AccountManager.getAuthToken() pour demander le nouveau jeton d'authentification.
Le dernier cas, où le jeton a expiré, n'est pas réellement un AccountManager échec. La seule façon de savoir
si un jeton a expiré est de contacter le serveur, et il serait inutile et coûteux de  AccountManager se connecter
continuellement pour vérifier l'état de tous ses jetons. Il s'agit donc d'une panne qui ne peut être détectée
que lorsqu'une application comme la vôtre tente d'utiliser le jeton d'authentification pour accéder à un
service en ligne.

g) Connectez-vous au service en ligne :

L'exemple ci-dessous montre comment se connecter à un serveur Google. Étant donné que Google utilise
le protocole OAuth2 standard de l'industrie pour authentifier les requêtes, les techniques décrites ici sont
largement applicables. Gardez à l'esprit, cependant, que chaque serveur est différent. Vous devrez peut-être
apporter des modifications mineures à ces instructions pour tenir compte de votre situation spécifique.

Les API Google exigent que vous fournissiez quatre valeurs avec chaque requête : la clé API, l'ID client, le
secret client et la clé d'authentification. Les trois premiers proviennent du site Web de Google API
Console. Le dernier est la valeur de chaîne que vous avez obtenue en
appelant AccountManager.getAuthToken(). Vous les transmettez au serveur Google dans le cadre d'une
requête HTTP.

URL url = new URL("https://www.googleapis.com/tasks/v1/users/@me/lists?key=" + your_api_key);


URLConnection conn = (HttpURLConnection) url.openConnection();
conn.addRequestProperty("client_id", your client id);
conn.addRequestProperty("client_secret", your client secret);
conn.setRequestProperty("Authorization", "OAuth " + token);

Si la requête renvoie un code d'erreur HTTP de 401, votre jeton a été refusé. Comme mentionné dans la
dernière section, la raison la plus courante est que le jeton a expiré. La solution est simple :
appelez AccountManager.invalidateAuthToken() et répétez le processus d'acquisition de jeton une fois de
plus.

6/7
Étant donné que les jetons expirés sont si courants et qu'il est si facile de les réparer, de nombreuses
applications supposent simplement que le jeton a expiré avant même de le demander. Si le renouvellement
d'un jeton est une opération bon marché pour votre serveur, vous préférerez peut-être
appeler AccountManager.invalidateAuthToken() avant le premier appel à AccountManager.getAuthToken(), et
vous éviterez de demander un jeton d'authentification deux fois.

7/7

Vous aimerez peut-être aussi