php rest api client library mit oauth2

nun das shopware6 (admin) rest-api oauth2 benutzt, welche php library benutzt ihr um diese einfach zu benutzen?

hab mit guzzlehttp/guzzle und kamermans/guzzle-oauth2-subscriber versucht:

 'http://shopware6.local/api/oauth/token',
]);
$reauth_config = [
    'client_id' => 'SWIASTZOVFA2B3BJSUTMV0VASA',
    'client_secret' => 'Ykl1WHk1aUxKbzlRVExVR1hqT1BzQ09RTjFLbUZ4ZUpJbW1EQjA',
];
$grant_type = new ClientCredentials($reauth_client, $reauth_config);
$oauth = new OAuth2Middleware($grant_type);
$stack = HandlerStack::create();
$stack->push($oauth);

$client = new Client([
    'base_uri' => 'http://shopware6.local/api/v1/',
    'handler' => $stack,
    'auth' => 'oauth',
    'headers' => [
        'accept' => 'application/json',
        //'accept' => 'application/vnd.api+json' // also called "json:api"
    ],
]);
$res = $client->get('product');
$data = json_decode($res->getBody());
echo(json_encode($data, JSON_PRETTY_PRINT));

es kommt aber fehler 401 Unauthorized : The user credentials were incorrect

  • wieso sagt der fehler “user”, wenn ich “client” credentials benutze?
  • ist shopware6 admin api 100% fertig und korrekt?
  • ist was falsch mit diese example code?
  • ist guzzle-oauth2-subscriber falsch implementiert?
  • gibt es ne bessere/passenderes php oauth2 library was mit shopware6 funktioniert?
  • mit welche php code kannst du mit shopware6 admin api kommunizieren?

Habe es auch mit Guzzle gebaut. Habe ein RestService, RestRepository sowie SalesChannelService und SalesChannelRepository.

Wie der Fehler sagt, sind deine Daten nicht gültig. Die base_uri ist ohne /api/vx sowie bei auth habe ich mit Bearer gearbeitet.

Zuerst hole ich mir mit /api/oauth/token den richtigen Token den ich brauche. (client-id & client-secret) brauchst du dafür. Mit diesem accesstoken als Bearer kannst du dann die api request abrufen.

Wie der Fehler sagt, sind deine Daten nicht gültig.

man kann ja nicht viel falsch machen beim copy-and-paste… (aber erst wenn man die deaktivierten input felder in shopware admin-ui für client_id und client_secret über devtools wieder aktiviert…) oder „Access key ID“ !== client_id && „Secret access key“ !== client_secret ???

aber wenigstens funktioniert PasswordCredentials mit irgendein client_id das ich nicht definiert habe:

$grant_type = new PasswordCredentials($reauth_client, [
	'client_id' => 'administration',
	'username' => 'admin',
	'password' => 'admin',
]);

ist ja für unsere intranet, also mir egal das da echte website user login daten drin stehen…

Du kannst über zwei wege die ganzen Sachen triggern. Über die /sales-channel-api oder /api/v1.

Je nach Anwendungsfalls reicht die /sales-channel-api/. Um diese zu benutzen brauchst du:

Benutzernamen: mail@deinemail.de 

Password: IrgendeinPassword

sales-channel-api. (Backend -> Verkaufskanäle (bisschen weiter unten ist der Schlüssel))

 

Kannst dir dann so den sw-context-token  holen.

$body = json_encode([
    'username' => $this->config['api-secret']['username'],
    'password' => $this->config['api-secret']['password']
]);

$response = $this->salesClient->post(
    '/sales-channel-api/v1/customer/login',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'sw-access-key' => $this->config['api-secret']['sales-channel-api'],
        ],
        'body' => $body
    ]
);

 

So, willst du nun die /api/v1 benutzen brauchst du eine Integration. (http://shopware.local/admin#/sw/integration/index)

Speicher dir die client-id & client-secret weg. Um überhaupt Request zu machen, brauchst du erstmal den Token der dadruch generiert wird.

$body = json_encode([
    'client_id' => $this->config['api-secret']['client-id'],
    'client_secret' => $this->config['api-secret']['client-secret'],
    'grant_type' => 'client_credentials'
]);

$response = $this->restClient->post(
    '/api/oauth/token',
    [
        'Content-Type' => 'application/json',
        'body' => $body
    ]
);

Den access_token  brauchst du jetzt um weitere Request zu machen.

return new Request(
    $method,
    $this->config['base_uri'] . '/api/v1/' . $uri,
    [
        'Authorization' => 'Bearer ' . $this->accessToken,
        'Accept' => '*/*',
        'Content-Type' => 'application/json'
    ],
    $body
);

 

Ich denke, dass du mit diesen Informationen zurecht kommst.

 

Grüße

ich brauche keine oauth2 standard client implementation details (wenn es teile davon sein soll), ich möchte eine bestehende library benutzen, dafür sind ja standards da.

und in paar jahren ist oauth2 eh „zu unsicher“ für leute, also schreiben die neue standards und libraries, und ich möchte nicht in diese never-ending boring-as-hell katze-maus spiel mitmachen, danke.

ps. kriegst du denn ClientCredentials mit shopware6 admin api zum laufen? GitHub - kamermans/guzzle-oauth2-subscriber: OAuth 2.0 Client for Guzzle 4, 5 and 6 - no more dependency hell!

@wontfix schrieb:

ich brauche keine oauth2 standard client implementation details (wenn es teile davon sein soll), ich möchte eine bestehende library benutzen, dafür sind ja standards da.

und in paar jahren ist oauth2 eh „zu unsicher“ für leute, also schreiben die neue standards und libraries, und ich möchte nicht in diese never-ending boring-as-hell katze-maus spiel mitmachen, danke.

ps. kriegst du denn ClientCredentials mit shopware6 admin api zum laufen? https://github.com/kamermans/guzzle-oauth2-subscriber#client-credentials-example

Kann ich heute mal probieren, aber sollte damit auch kein Problem sein. Nur ist es zuletzt vor 11 Monaten bearbeitet worden. Also ob das auch noch so aktuell ist, ist die Frage.