HttpClient auf eigene API liefert 401 / "Missing Authorization header"

Ich hätte gedacht dass der HttpClient den nötigen BearerToken automatisch erzeugt, aber das scheint nicht der Fall zu sein. Hier meine “custom/plugins/MeinPlugin/src/Resources/app/storefront/src/main.js”:

import HttpClient from 'src/service/http-client.service';

var loadEnd = function(responseText) {
    console.log(responseText);
};

var httpClient = new HttpClient(window.accessKey, window.contextToken);
httpClient.post('/api/v1/myvendor/myaction', null, loadEnd);

Der Request enthält zwar die beiden Kopfzeilen “sw-access-key” und “sw-context-token”, bekommt dann aber die Antwort “401 Unauthorized” bzw. im JSON so etwas:

Lässt sich über JS die Authentifizierung überhaupt realisieren?

Grüße, Ansgar

Um meine Frage selbst zu beantworten - ich kann im Frontend wohl besser die Sales Channel API verwenden, die gar keine Authentifizierung benötigt. Damit funktioniert der JS Code von oben ohne weiteres. Im Controller musste ich nur die Route anders setzen:

connection = $connection;
    }

    /**
     * @Route("/sales-channel-api/v{version}/myvendor/myaction", name="sales-channel-api.action.myvendor.myaction", methods={"POST"})
     * @param Request $request
     * @param Context $context
     * @return JsonResponse
     * @throws \Doctrine\DBAL\DBALException
     */
    public function myaction(Request $request, Context $context): JsonResponse
    {
        // do something
        $cart = $this->connection->fetchAssoc("select token, name, price, created_at from cart order by rand() limit 1");
        return new JsonResponse([$cart['created_at'], $cart['price']]);
    }

}

 

@ansgar schrieb:

Ich hätte gedacht dass der HttpClient den nötigen BearerToken automatisch erzeugt…

Grüße, Ansgar

Da eine aussagekräftige Dokumentation zum Bearer Token Access fehlt und damit das für andere Kollegen eventuell auch intreressant wäre, gebe ich mein Wissen zum Besten:
 

Component.register('mycomponent', {
    ...
    inject: [
        'loginService'
    ],
    
    methods: {       
       getBearerToken() {
          return this.loginService.getToken();
       }
    }
}

 

1 „Gefällt mir“

Das sind komplett andere Bereiche das eine ist Frontend deins ist Admin. Du solltest einen eigenen Service anlegen und dort dann die getBasicHeaders methode verwenden.  Und diesen dann injecten

@Shyim schrieb:

Das sind komplett andere Bereiche das eine ist Frontend deins ist Admin.

Na dann ist das ja geklärt, …nach 6 Monaten  Undecided