0

Ich habe eine eckige Fabrik namens currentUser, um die Benutzerinformationen zu halten, wenn sie sich in meiner App anmelden (einschließlich der Authentifizierungs-Token). Diese Fabrik wird in viele Controller eingespeist und in diesen Fällen habe ich keine Probleme, wenn ich currentUser.getProfile(). Token benutze.

Ich habe auch verschiedene andere Fabriken, die jeweils ein $ Ressourcenobjekt für die API-Aufrufe zurückgeben. In diesen Fabriken injiziere ich currentUser, so dass ich das Authentifizierungs-Token dazu bringen kann, den Anforderungsheadern hinzuzufügen. Hier ist ein vereinfachtes Beispiel einer dieser Fabriken.

angular 
    .module("common.services") 
    .factory("userAccount", 
      ["$resource", 
      "appSettings", 
      "currentUser", 
      userAccount]) 

function userAccount($resource, appSettings, currentUser) { 
    return { 
     logout: $resource(appSettings.serverPath + "/api/Account/Logout", null, 
      { 
       'logoutUser': { 
        method: 'POST', 
        headers: { 
         'Authorization': 'Bearer ' + currentUser.getProfile().token 
        } 
       } 
      }) 
    } 
} 

jedoch currentUser.getProfile() Token ist immer leer und ich erhalte eine unathorised Fehler, obwohl, wenn ich den Wert log in einem meiner Controller ist nicht leer. Was könnte das verursachen?

Edit:. Das Problem nicht nur mit dem Werk scheint current zu sein, wie wenn ich currentUser.getProfile() ersetzen Token mit localStorage.getItem (‚Token‘) Ich scheine das gleiche Problem zu haben. Ein Controller protokolliert das lokal gespeicherte Token korrekt, es wird jedoch nicht den Kopfzeilen von API-Anforderungen hinzugefügt.

Antwort

3

Sie benötigen logout als eine Funktion, die $resource zurückgibt.

Die Art und Weise haben Sie es jetzt der Ruf an currentUser.getProfile() so schnell gemacht wird, als der Dienst, die wahrscheinlich in initialisiert wird, bevor Benutzer auch Protokolle

function userAccount($resource, appSettings, currentUser) { 
    return { 
    logout: function() { 
     return $resource(appSettings.serverPath + "/api/Account/Logout", null, { 
     'logoutUser': { 
      method: 'POST', 
      headers: { 
      'Authorization': 'Bearer ' + currentUser.getProfile().token 
      } 
     } 
     }) 
    } 
    } 
} 

den Anruf Nun wird das Token bekommen nicht gemacht bis du anrufst userAccount.logout()

+0

Danke für die Antwort, das scheint jetzt zu funktionieren! – shadowsora

+0

Sie können auch prüfen, wie httpInterceptors arbeiten – charlietfl

0

Nicht genau eine Lösung, aber es scheint ein paar Workarounds zu geben. Der, den ich zu verwenden wählte, war die Auth-Token als gemeinsame HTTP-Header wie folgt hinzuzufügen:

darüber
$http.defaults.headers.common['Authorization'] = 'Bearer ' + data.access_token; 

Blog post hier: http://blog.brunoscopelliti.com/authentication-to-a-restful-web-service-in-an-angularjs-web-app/

ich immer noch daran interessiert wäre, wenn jemand wusste, was ich war aber vorher falsch?