updated demo to use the new login redirect
This commit is contained in:
77
README.DE.md
77
README.DE.md
@@ -57,7 +57,7 @@ Ein PHX-Frontend-Plugin ist eine Angular-Anwendung, die als **Custom Element** (
|
||||
- Custom-Element-Tag: `frontend-plugin-demo`
|
||||
- Beispiel-Routen: Hello World, Product View, Address List
|
||||
- GraphQL-Abfragen über den PHX-Host-Apollo (Production) oder einen lokalen Apollo-Client (Development)
|
||||
- Login-Flow für die eigenständige Entwicklung ohne vorkonfigurierten API-Key
|
||||
- PHX-Login-Weiterleitung und Callback-Route für die eigenständige Entwicklung ohne vorkonfigurierten API-Key
|
||||
- PrimeNG- und Tailwind-Styling im PHX-Stil
|
||||
|
||||
---
|
||||
@@ -71,7 +71,7 @@ Ein PHX-Frontend-Plugin ist eine Angular-Anwendung, die als **Custom Element** (
|
||||
Für die lokale eigenständige Entwicklung benötigen Sie außerdem eines der folgenden:
|
||||
|
||||
- Einen PHX-API-Benutzer-Token in Ihrer Development-Umgebung, oder
|
||||
- Gültige Anmeldedaten für den integrierten Login-Bildschirm (siehe [Apollo, Auth Guard und Login](#apollo-auth-guard-und-login))
|
||||
- Zugriff auf die PHX-Login-Seite (siehe [Apollo, Auth Guard und Login](#apollo-auth-guard-und-login))
|
||||
|
||||
---
|
||||
|
||||
@@ -117,7 +117,7 @@ Das Manifest verweist auf die kompilierte `main.js` im Verzeichnis `latest/` die
|
||||
|
||||
### Standalone client (üblicher Angular-Workflow)
|
||||
|
||||
Startet die App mit der **Development**-Build-Konfiguration auf Port **4201** — Routing, Login und ein lokaler Apollo-Client funktionieren ohne PHX.
|
||||
Startet die App mit der **Development**-Build-Konfiguration auf Port **4201** — Routing, PHX-Login-Weiterleitung und ein lokaler Apollo-Client funktionieren ohne Einbettung des Plugins in PHX.
|
||||
|
||||
```bash
|
||||
yarn client
|
||||
@@ -175,7 +175,7 @@ phx-frontend-plugin-demo/
|
||||
├── src/
|
||||
│ ├── app/
|
||||
│ │ ├── components/ # Demo pages (hello-world, product-view, …)
|
||||
│ │ ├── login/ # Login form (standalone development)
|
||||
│ │ ├── login.ts # Auth-Callback-Route (Standalone-Entwicklung)
|
||||
│ │ ├── services/
|
||||
│ │ │ ├── apollo.service.ts
|
||||
│ │ │ └── phoenix-host-bridge.service.ts
|
||||
@@ -342,8 +342,8 @@ export const environment: Environment = {
|
||||
production: false,
|
||||
apiUrl: 'http://localhost:3000/admin-api',
|
||||
wsUrl: 'ws://localhost:3000/admin-api',
|
||||
apiKey: undefined, // or a PHX API user token; otherwise use the login route
|
||||
serverUrl: 'https://localhost:4200',
|
||||
apiKey: undefined, // or a PHX API user token; otherwise redirects to PHX login
|
||||
serverUrl: 'https://localhost:4200', // PHX instance used for standalone login redirect
|
||||
};
|
||||
```
|
||||
|
||||
@@ -607,7 +607,7 @@ Eigener Port: `PORT=8080 yarn serve`.
|
||||
|
||||
Im **Production**-Modus (eingebettet in PHX) übernimmt der Host die Authentifizierung. Nutzen Sie den Apollo Client aus `IPluginServices` über `PhoenixHostBridgeService` — ein separater Login-Flow ist nicht nötig.
|
||||
|
||||
Im **Development**-Modus (Standalone) stellen Sie einen eigenen Apollo Client und optional einen Login bereit.
|
||||
Im **Development**-Modus (Standalone) stellen Sie einen eigenen Apollo Client bereit und leiten nicht authentifizierte Nutzer zur PHX-Login-Seite weiter. PHX leitet danach zurück auf eine lokale `/login`-Callback-Route, die den Token speichert und den Nutzer zur ursprünglichen Seite zurückbringt.
|
||||
|
||||
#### Apollo provider
|
||||
|
||||
@@ -648,54 +648,53 @@ export class ApolloService {
|
||||
|
||||
Wenden Sie dasselbe Muster auf andere Host-Services an (z. B. Notifications), wenn Sie Standalone-Fallbacks benötigen.
|
||||
|
||||
#### Login component
|
||||
#### Login-Callback-Route
|
||||
|
||||
Für die Entwicklung ohne voreingestellten API-Key fügen Sie eine `/login`-Route hinzu, die die PHX-`login`-Mutation aufruft:
|
||||
Für die Entwicklung ohne voreingestellten API-Key fügen Sie eine `/login`-Route hinzu, die als **Auth-Callback** dient — nicht als Login-Formular. Ist der Nutzer nicht authentifiziert, leitet der Auth Guard zur PHX-Login-Seite (`environment.serverUrl`) weiter. Nach erfolgreichem Login leitet PHX zurück auf die `/login`-Route Ihres Plugins mit einem `authToken`-Query-Parameter und einem base64-kodierten `redirectTo`-Ziel.
|
||||
|
||||
```gql
|
||||
mutation Login($username: String!, $password: String!) {
|
||||
login(username: $username, password: $password) {
|
||||
... on CurrentUser {
|
||||
id
|
||||
identifier
|
||||
channels {
|
||||
id
|
||||
token
|
||||
Die Callback-Komponente speichert den Token in `localStorage` und navigiert zurück zur ursprünglichen Seite:
|
||||
|
||||
```ts
|
||||
@Component({
|
||||
selector: 'app-login',
|
||||
template: `
|
||||
<div class="flex flex-col items-center justify-center h-screen w-screen opacity-20">
|
||||
<div class="animate-fadein duration-1000 animate-infinite animate-alternate text-4xl">Signing in...</div>
|
||||
</div>
|
||||
`,
|
||||
})
|
||||
export class Login {
|
||||
constructor(private readonly route: ActivatedRoute) {
|
||||
this.route.queryParams.subscribe((params) => {
|
||||
const token = params['authToken'];
|
||||
if (token) {
|
||||
const redirectTo = decodeURIComponent(atob(params['redirectTo']));
|
||||
localStorage.setItem('api-key', token);
|
||||
window.history.replaceState({}, '', redirectTo);
|
||||
window.location.href = redirectTo;
|
||||
}
|
||||
}
|
||||
... on InvalidCredentialsError {
|
||||
errorCode
|
||||
message
|
||||
}
|
||||
... on NativeAuthStrategyError {
|
||||
errorCode
|
||||
message
|
||||
}
|
||||
... on EmailCodeAuthStrategyError {
|
||||
errorCode
|
||||
message
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Eine vollständige Formular-Implementierung finden Sie unter `src/app/login/` in diesem Repo.
|
||||
Die vollständige Implementierung finden Sie unter `src/app/login.ts` in diesem Repo.
|
||||
|
||||
#### Auth guard
|
||||
|
||||
Nicht authentifizierte Nutzer nur im Development-Modus zum Login weiterleiten:
|
||||
Nicht authentifizierte Nutzer nur im Development-Modus zur PHX-Login-Seite weiterleiten. Der `redirectTo`-Query-Parameter verknüpft die Weiterleitung über die `/login`-Callback-Route Ihres Plugins:
|
||||
|
||||
```ts
|
||||
@Injectable()
|
||||
export class AuthGuard implements CanActivate {
|
||||
private readonly router = inject(Router);
|
||||
|
||||
canActivate(_route: ActivatedRouteSnapshot, _state: RouterStateSnapshot): boolean {
|
||||
const token = environment.apiKey ?? localStorage.getItem('api-key');
|
||||
if (!environment.production && !token) {
|
||||
this.router.navigate(['login'], {
|
||||
queryParams: { redirectTo: btoa(window.location.pathname + window.location.search) },
|
||||
});
|
||||
const redirectTo = encodeURIComponent(
|
||||
btoa(`${window.location.protocol}//${window.location.host}/login?redirectTo=${encodeURIComponent(btoa(window.location.href))}`)
|
||||
);
|
||||
window.location.href = `${environment.serverUrl}/login?redirectTo=${redirectTo}`;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -748,7 +747,7 @@ Dieses Repository führt zusätzlich `copy-latest.mjs` parallel zu `build` aus,
|
||||
| Symptom | Zu prüfen |
|
||||
|---------|-----------|
|
||||
| PHX zeigt eine alte Plugin-Version | Hard-Refresh; prüfen, ob `serve.json` `Cache-Control: no-store` für JS setzt; `yarn run plugin` neu starten |
|
||||
| `401` / GraphQL-Auth-Fehler im Standalone-Modus | `apiKey` in `environment.development.ts` setzen oder über `/login` anmelden |
|
||||
| `401` / GraphQL-Auth-Fehler im Standalone-Modus | `apiKey` in `environment.development.ts` setzen, oder sicherstellen, dass `serverUrl` auf Ihre PHX-Instanz zeigt, damit die Login-Weiterleitung funktioniert |
|
||||
| `yarn add @phx-erp/shared` schlägt fehl | Netzwerkzugriff auf die öffentliche npm-Registry prüfen; `yarn install` erneut ausführen |
|
||||
| Routing in PHX funktioniert nicht | Routen-Segmente zu `stripTrailingSegments` in `providePhoenixPluginWithPrimeNG` hinzufügen |
|
||||
| Tailwind-Klassen fehlen in einer Komponente | `@tailwind`-Direktiven in den `styles` der Komponente ergänzen |
|
||||
|
||||
Reference in New Issue
Block a user