Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> logowanie do aplikacji za pomocą Tokena
inomi13
post
Post #1





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


Do tej pory miałem zadanie cron, które wykonywało się raz dziennie i pobierało zawartość skrzynki za pomocą imap_open. W związku z wyłączeniem przez Microsoft uwierzytelnienia za pomocą hasła oraz że PHP nie posiada wbudowanej funkcji obsługującej Oauth2 w imapi'e skorzystałem z gotowego rozwiązania https://github.com/Webklex/php-imap i loguje się za pomocą Oauth2.

Problem polega na tym że ważność tokena to 1 godzina więc zadanie cron w tym wypadku odpada. Zrobiłem partyzanckie rozwiązanie tzn. loguje się przez przeglądarkę do konta Microsoft, następnie w sesji przesyłam otrzymany get adres e-mail oraz token do pliku konfiguracyjnego php-imap, a następnie dodałem meta
  1. <meta http-equiv="refresh" content = "3600" />
, które odświeża stronę przed wygaśnięciem tokena.

Proszę o sugestie jak powinno to sensownie działać, może odświeżenie tokena...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
inomi13
post
Post #2





Grupa: Zarejestrowani
Postów: 95
Pomógł: 0
Dołączył: 16.08.2017

Ostrzeżenie: (0%)
-----


Zrobiłem tak jak sugerowałeś jednak nadal nie wiem dlaczego nie otrzymuje refresh_tokena

  1. $endpoint_authorize = 'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxxxx/oauth2/v2.0/authorize';
  2. $endpoint_token = 'https://login.microsoftonline.com/xxxxxxxxxxxxxxxxxxxxxxxxx/oauth2/v2.0/token';
  3. $redirect_uri = 'https://xxxxxxxxxxxxxxxxxxxxxxxxx.php';
  4.  
  5. $client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
  6. $client_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
  7.  
  8. $login = $endpoint_authorize.'?'.http_build_query([
  9. 'client_id' => $client_id,
  10. 'redirect_uri' => $redirect_uri,
  11. 'scope' => 'https://outlook.office.com/IMAP.AccessAsUser.All',
  12. 'response_type' => 'code',
  13. ]);
  14.  
  15. echo '<a href = "'.$login.'">Loguj</a>';
  16.  
  17. if(isset($_GET['code']))
  18. {
  19. $code = $_GET['code'];
  20.  
  21. $ch = curl_init();
  22. curl_setopt($ch, CURLOPT_URL,$endpoint_token);
  23. curl_setopt($ch, CURLOPT_POST, TRUE);
  24. curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  26. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
  27. 'code' => $code,
  28. 'client_id' => $client_id,
  29. 'client_secret' => $client_secret,
  30. 'redirect_uri' => $redirect_uri,
  31. 'grant_type' => 'authorization_code',
  32. ]));
  33. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  34. $response = curl_exec($ch);
  35. curl_close($ch);
  36.  
  37. echo '<pre>';
  38. print_r($response);
  39. echo '</pre>';
  40. }


Wynik dostaje:
"token_type":"Bearer",
"scope":"https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/User.Read",
"expires_in":3749,
"ext_expires_in":3749,
"access_token":"eyw......."


Ponowne odświeżenie strony daje wynik

{"error":"invalid_grant","error_description":"AADSTS54005: OAuth2 Authorization code was already redeemed, please retry with a new valid code or use an existing refresh token.\r\nTrace ID: xxxx-6c31-40c7-aa47-74b745582300\r\nCorrelation ID: xxxxx-8ecd-40da-a2d4-132f3be38b0a\r\nTimestamp: 2022-11-12 19:30:06Z","error_codes":[54005],"timestamp":"2022-11-12 19:30:06Z","trace_id":"xxxxx-6c31-40c7-aa47-74b745582300","correlation_id":"xxxxx-8ecd-40da-a2d4-132f3be38b0a"}

Znalazłem rozwiązanie mojego problemu, który polegał na złym ustawieniu zakresu tzn. jeżeli chcemy otrzymać refresh_token to zakres musi kończyć się offline_access. Oczywiście dostęp do offline_access musi być również ustawiony po stronie Azure.

Ten post edytował inomi13 12.11.2022, 20:31:59
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 28.12.2025 - 03:42