Je développe une application Android et un service Web qui communiquent. Mon service Web est dans l'API Web 2 avec l'authentification du support de jeton.Erreur 401 sur l'API WEB 2 lorsqu'il y a beaucoup de demande de l'appareil Android
Mon problème est que lorsque je vous envoie trop de demandes (~ 20 demande en 15 secondes) à mon service Web de mon application Android, la réponse WS avec
“401” : “Authorization has been denied for this request”
Cela arrive seulement sur le serveur de production (Amen Hoster) ET de l'appareil Android. Par exemple, si j'essaye avec Postman, tout fonctionne bien. C'est donc lié à mon serveur de production et/ou à ma demande d'application Android.
Le code d'accès au service Web
URL obj = new URL(SERVEUR_URL + url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Authorization", "Bearer " + token);
con.setRequestProperty("Content-Type", "application/json");
int responseCode = con.getResponseCode();
String responseMessage = con.getResponseMessage();
Le fournisseur d'authentification sur mon service Web est le défaut. Pas de modifications
La demande de mon Android App (fonctionne pas à chaque fois)
GET http://api.xxxx.com/api/Weesps/GetAvailableWeesps HTTP/1.1
Authorization: Bearer XXXX
Content-Type: application/json
User-Agent: Dalvik/2.1.0 (Linux; U; Android 6.0; Google Nexus 5X - 6.0.0 - API 23 - 1080x1920 Build/MRA58K)
Host: api.xxxx.com
Connection: Keep-Alive
Accept-Encoding: gzip
La demande de Postman (travail à chaque fois)
GET http://api.xxxx.com/api/Weesps/GetAvailableWeesps HTTP/1.1
Host: api.xxxx.com
Connection: keep-alive
Authorization: Bearer XXXX
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Postman-Token: bca55154-775d-9709-7a8b-4793393890ad
Accept: */*
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: dadaproaffinity=14ff51cc869a14d3552485cb4ceee1faa1be7165cc5d4b0e2b19370f11afcbea
Ce que j'ai essayé:
- Reproduisez cette erreur dans loc al: il fonctionne très bien sur le serveur local (serveurs Web et SQL) à partir de l'application Android ou de Postman
- je vérifie que le jeton a été correctement envoyé dans toutes les demandes
- La demande d'Android est le même à chaque fois
- Essayé Pour ajouter l'en-tête manquant à ma demande d'application android
Je passe deux jours sur ce problème et lis beaucoup de posts de stackoverflow mais personne ne m'aide. Merci pour votre aide.
MISE À JOUR 1:
Avec Fiddler je l'ai vu dans la demande GET de Postman, ils étaient un en-tête de Cookie. Ce cookie est envoyé lorsque nous demandons un jeton au porteur.
Exemple de réponse jeton du serveur
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 691
Content-Type: application/json;charset=UTF-8
Expires: -1
Server: Microsoft-IIS/8.5
Set-Cookie: .AspNet.Cookies=XXXX; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Powered-By: ARR/2.5
Date: Tue, 31 May 2016 16:55:39 GMT
{"access_token":"XXXX","token_type":"bearer","expires_in":1209599,"userName":"Foo",".issued":"Tue, 31 May 2016 16:55:40 GMT",".expires":"Tue, 14 Jun 2016 16:55:40 GMT"}
Fiddler et Postman sauvé ce cookie et ils ont mis automatiquement dans les requêtes API (par exemple sur la « La demande de Postman » bloc de code). Lorsque je supprime le cookie de la requête Postman GET, cela ne fonctionne pas (tout comme mon application android). Maintenant, la question est la suivante: pourquoi l'API Web 2 envoie-t-elle un cookie au lieu de seulement utiliser le jeton? Et pourquoi le jeton fonctionne bien dans les premières demandes et ne fonctionne pas correctement pour les demandes suivantes?
Une différence qui ressort entre les deux demandes est l'en-tête Cache-Control. Avez-vous essayé de régler cela sur vos demandes Android? – elevine
Salut Elevine, merci de votre lecture. Oui, j'ai essayé avec ou sans le Cache-Control et il n'y a pas de différence – JohnB