Contao-Camp 2024
Ergebnis 1 bis 2 von 2

Thema: BackendUser Login via Token

  1. #1
    Contao-Nutzer
    Registriert seit
    24.06.2020.
    Beiträge
    1

    Standard BackendUser Login via Token

    Hallo,

    ich bin dabei einen Controller zu schreiben, über den man sich per Token direkt ins Backend einloggen kann (User klickt auf externer Seite einen Button und wird bei mir im Backend eingeloggt).

    In anderen Posts habe ich so einen Token-Login/Auto-Login für Member gefunden und versucht dies so für BackendUser umzubauen. Hier der verkürzte Code:

    PHP-Code:
    <?php
    use Contao\BackendUser;
    use 
    Contao\UserModel;

    /**
     * @Route("/login/external", name=LoginExternalController::class, defaults={"_scope": "frontend"})
     */
    class LoginExternalController extends AbstractController implements FrameworkAwareInterface {
        use 
    FrameworkAwareTrait;
        protected 
    $request;   protected $userProvider;   protected $tokenStorage;   protected $router;   protected $dispatcher;   protected $userChecker;    protected $authenticationSuccessHandler;

        public function 
    __construct(
            
    UserProviderInterface $userProvider//'@contao.security.backend_user_provider'
            
    TokenStorageInterface $tokenStorage//'@security.token_storage'
            
    UrlGenerator $router,
            
    EventDispatcherInterface $dispatcher//'@event_dispatcher'
            
    UserChecker $userChecker//'@contao.security.user_checker'
            
    AuthenticationSuccessHandlerInterface $authenticationSuccessHandler //'@contao.security.authentication_success_handler'
        
    ) {...}
        public function 
    __invoke(Request $request): RedirectResponse {
          
    $this->request $request;
          
    $this->framework->initialize();
          
    //Get UserData from token (username, email, name)
          //Find User or create User with Group
          
    $user UserModel::findByUsername($token->$username);
          
    $this->login($user->username);
          return new 
    RedirectResponse("/contao");
        }

        public function 
    login($username) {
          
    $user $this->userProvider->loadUserByUsername($username);
          
    $this->userChecker->checkPreAuth($user);
          
    $usernamePasswordToken = new UsernamePasswordToken($usernull'backend'$user->getRoles());
          
    $this->tokenStorage->setToken($usernamePasswordToken);
          
    $this->dispatcher->dispatch('security.interactive_login', new InteractiveLoginEvent($this->request$usernamePasswordToken));
          
    $this->request->request->set('_target_path'base64_encode($this->request->getRequestUri()));
          
    $this->authenticationSuccessHandler->onAuthenticationSuccess($this->request$usernamePasswordToken);
        }
    }
    Im Prinzip läuft auch alles durch, bis es zum Redirect geht, der dann einfach auf die Contao Login-Form weiterleitet. Ich habe gesehen, dass in der Datenbank bei Aufruf auch eine Session des Users in die Datenbank eingetragen wird und das LastLogin-Feld geupdated wird.

    Leider hab ich gar keine Beispiele gefunden habe, wie man einen User einloggt, nur einen Member. Deshalb stellt sich natürlich zuerst die Frage ob dies überhaupt möglich ist?

    Ansonsten hatte ich noch überlegt, dass es vielleicht daran liegen könnte, dass die User kein Passwort eingetragen haben.

    Danke für eure Hilfe,

    Viele Grüße
    Stefan
    Geändert von dakitec (31.03.2021 um 23:14 Uhr)

  2. #2
    Contao-Nutzer Avatar von dako314
    Registriert seit
    04.05.2013.
    Ort
    Mannheim
    Beiträge
    120

    Standard

    Ich habe das mal lokal probiert.

    Das Problem ist folgendes:

    PHP-Code:
    defaults={"_scope""frontend"}) 
    muss so aussehen:

    PHP-Code:
    defaults={"_scope""backend"}) 
    Außerdem würde ich unten das hier noch ändern:

    PHP-Code:
    return new RedirectResponse($this->generateUrl('contao_backend')); 
    Die beiden Zeilen sind nicht benötigt:
    PHP-Code:
    $this->request->request->set('_target_path'base64_encode($this->request->getRequestUri())); 
    $this->authenticationSuccessHandler->onAuthenticationSuccess($this->request$usernamePasswordToken); 
    VG,
    Daniel Koch

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •