Browse Source

Route fix

pull/1/head
Sebastian 9 years ago
parent
commit
7d9ce6d3e3
  1. 4
      src/Squidex/Configurations/Identity/LazyClientStore.cs
  2. 12
      src/Squidex/Configurations/Identity/MyIdentityOptions.cs
  3. 13
      src/Squidex/Startup.cs
  4. 9
      src/Squidex/app/app.routes.ts
  5. 6
      src/Squidex/app/components/auth/auth.module.ts
  6. 1
      src/Squidex/app/components/auth/declarations.ts
  7. 2
      src/Squidex/app/components/auth/index.ts
  8. 5
      src/Squidex/app/components/auth/login-page.component.html
  9. 38
      src/Squidex/app/components/auth/login-page.component.ts
  10. 5
      src/Squidex/app/components/auth/logout-page.component.html
  11. 14
      src/Squidex/app/components/auth/logout-page.component.ts
  12. 2
      src/Squidex/app/components/index.ts
  13. 3
      src/Squidex/app/components/login/login-page.component.html
  14. 21
      src/Squidex/app/shared/guards/auth.guard.ts
  15. 35
      src/Squidex/app/shared/services/auth.service.ts

4
src/Squidex/Configurations/Identity/LazyClientStore.cs

@ -47,6 +47,10 @@ namespace Squidex.Configurations.Identity
ClientName = id, ClientName = id,
RedirectUris = new List<string> RedirectUris = new List<string>
{ {
options.BuildUrl("#/login;"),
options.BuildUrl("#/logout;"),
options.BuildUrl("login;"),
options.BuildUrl("logout;"),
options.BuildUrl("identity-server/client-callback-silent/"), options.BuildUrl("identity-server/client-callback-silent/"),
options.BuildUrl("identity-server/client-callback-popup/") options.BuildUrl("identity-server/client-callback-popup/")
}, },

12
src/Squidex/Configurations/Identity/MyIdentityOptions.cs

@ -5,6 +5,9 @@
// Copyright (c) Squidex Group // Copyright (c) Squidex Group
// All rights reserved. // All rights reserved.
// ========================================================================== // ==========================================================================
using System;
namespace Squidex.Configurations.Identity namespace Squidex.Configurations.Identity
{ {
public sealed class MyIdentityOptions public sealed class MyIdentityOptions
@ -23,7 +26,14 @@ namespace Squidex.Configurations.Identity
public string BuildUrl(string path) public string BuildUrl(string path)
{ {
return $"{BaseUrl.TrimEnd('/')}/{path.Trim('/')}/"; var url = $"{BaseUrl.TrimEnd('/')}/{path.Trim('/')}";
if (url.IndexOf("?", StringComparison.OrdinalIgnoreCase) < 0 &&
url.IndexOf(";", StringComparison.OrdinalIgnoreCase) < 0) {
url = url + "/";
}
return url;
} }
} }
} }

13
src/Squidex/Startup.cs

@ -149,11 +149,20 @@ namespace Squidex
{ {
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
app.UseWebpackProxy(); app.UseWebpackProxy();
app.UseDefaultFiles();
app.Use((context, next) => {
context.Request.Path = new PathString("/index.html");
return next();
});
} }
else else
{ {
app.UseDefaultFiles(new DefaultFilesOptions { DefaultFileNames = new List<string> { "build/index.html" } }); app.Use((context, next) => {
context.Request.Path = new PathString("/build/index.html");
return next();
});
} }
app.UseStaticFiles(); app.UseStaticFiles();

9
src/Squidex/app/app.routes.ts

@ -10,7 +10,8 @@ import * as Ng2Router from '@angular/router';
import { import {
AppsPageComponent, AppsPageComponent,
LoginPageComponent LoginPageComponent,
LogoutPageComponent
} from './components'; } from './components';
import { import {
@ -31,7 +32,11 @@ export const routes: Ng2Router.Routes = [
{ {
path: 'login', path: 'login',
component: LoginPageComponent component: LoginPageComponent
},
{
path: 'logout',
component: LogoutPageComponent
} }
]; ];
export const routing: Ng2.ModuleWithProviders = Ng2Router.RouterModule.forRoot(routes, { useHash: true }); export const routing: Ng2.ModuleWithProviders = Ng2Router.RouterModule.forRoot(routes, { useHash: false });

6
src/Squidex/app/components/login/login.module.ts → src/Squidex/app/components/auth/auth.module.ts

@ -10,7 +10,8 @@ import * as Ng2 from '@angular/core';
import { SqxFrameworkModule } from './../../framework'; import { SqxFrameworkModule } from './../../framework';
import { import {
LoginPageComponent LoginPageComponent,
LogoutPageComponent
} from './declarations'; } from './declarations';
@Ng2.NgModule({ @Ng2.NgModule({
@ -18,7 +19,8 @@ import {
SqxFrameworkModule SqxFrameworkModule
], ],
declarations: [ declarations: [
LoginPageComponent LoginPageComponent,
LogoutPageComponent
] ]
}) })
export class SqxLoginModule { } export class SqxLoginModule { }

1
src/Squidex/app/components/login/declarations.ts → src/Squidex/app/components/auth/declarations.ts

@ -6,3 +6,4 @@
*/ */
export * from './login-page.component'; export * from './login-page.component';
export * from './logout-page.component';

2
src/Squidex/app/components/login/index.ts → src/Squidex/app/components/auth/index.ts

@ -7,4 +7,4 @@
export * from './declarations'; export * from './declarations';
export * from './login.module'; export * from './auth.module';

5
src/Squidex/app/components/auth/login-page.component.html

@ -0,0 +1,5 @@
<div *ngIf="showError">
<div class="simple-error">
Failed to login
</div>
</div>

38
src/Squidex/app/components/auth/login-page.component.ts

@ -0,0 +1,38 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import * as Ng2 from '@angular/core';
import * as Ng2Router from '@angular/router';
import { AuthService } from './../../shared';
@Ng2.Component({
selector: 'login',
template: ''
})
export class LoginPageComponent implements Ng2.OnInit {
public showError = false;
constructor(
private readonly authService: AuthService,
private readonly router: Ng2Router.Router
) {
}
public ngOnInit() {
this.authService.loginComplete().subscribe(
() => {
debugger;
this.router.navigate(['/']);
},
e => {
debugger;
this.showError = true;
}
);
}
}

5
src/Squidex/app/components/auth/logout-page.component.html

@ -0,0 +1,5 @@
<div *ngIf="showError">
<div class="simple-error">
Failed to login
</div>
</div>

14
src/Squidex/app/components/login/login-page.component.ts → src/Squidex/app/components/auth/logout-page.component.ts

@ -6,27 +6,27 @@
*/ */
import * as Ng2 from '@angular/core'; import * as Ng2 from '@angular/core';
import * as Ng2Common from '@angular/common'; import * as Ng2Router from '@angular/router';
import { AuthService } from './../../shared'; import { AuthService } from './../../shared';
@Ng2.Component({ @Ng2.Component({
selector: 'login', selector: 'logout',
template template: ''
}) })
export class LoginPageComponent implements Ng2.OnInit { export class LogoutPageComponent implements Ng2.OnInit {
public showFailedError = false; public showFailedError = false;
constructor( constructor(
private readonly authService: AuthService, private readonly authService: AuthService,
private readonly location: Ng2Common.Location private readonly router: Ng2Router.Router
) { ) {
} }
public ngOnInit() { public ngOnInit() {
this.authService.login().subscribe( this.authService.logoutComplete().subscribe(
() => { () => {
this.location.back(); this.router.navigate(['/']);
}, },
() => { () => {
this.showFailedError = true; this.showFailedError = true;

2
src/Squidex/app/components/index.ts

@ -6,5 +6,5 @@
*/ */
export * from './apps'; export * from './apps';
export * from './auth';
export * from './layout'; export * from './layout';
export * from './login';

3
src/Squidex/app/components/login/login-page.component.html

@ -1,3 +0,0 @@
<div>
Logging in
</div>

21
src/Squidex/app/shared/guards/auth.guard.ts

@ -10,28 +10,21 @@ import * as Ng2Router from '@angular/router';
import { AuthService } from './../services/auth.service'; import { AuthService } from './../services/auth.service';
const LOGIN_URL = '/login/';
@Ng2.Injectable() @Ng2.Injectable()
export class AuthGuard implements Ng2Router.CanActivate { export class AuthGuard implements Ng2Router.CanActivate {
constructor( constructor(
private readonly router: Ng2Router.Router,
private readonly authService: AuthService private readonly authService: AuthService
) { ) {
} }
public canActivate(route: Ng2Router.ActivatedRouteSnapshot, state: Ng2Router.RouterStateSnapshot): Promise<boolean> | boolean { public canActivate(route: Ng2Router.ActivatedRouteSnapshot, state: Ng2Router.RouterStateSnapshot): Promise<boolean> | boolean {
if (state.url !== LOGIN_URL) { return this.authService.checkLogin().then(isAuthenticated => {
return this.authService.checkLogin().then(isAuthenticated => { if (!isAuthenticated) {
if (!isAuthenticated) { this.authService.login();
this.router.navigate([LOGIN_URL]);
return false;
}
return true;
});
}
return true; return false;
}
return true;
});
} }
} }

35
src/Squidex/app/shared/services/auth.service.ts

@ -7,6 +7,7 @@
import * as Ng2 from '@angular/core'; import * as Ng2 from '@angular/core';
import * as Ng2Http from '@angular/http'; import * as Ng2Http from '@angular/http';
import * as Ng2Router from '@angular/router';
import { import {
Log, Log,
@ -38,19 +39,21 @@ export class AuthService {
} }
constructor(apiUrl: ApiUrlConfig, constructor(apiUrl: ApiUrlConfig,
private readonly http: Ng2Http.Http, private readonly http: Ng2Http.Http
) { ) {
Log.logger = console; Log.logger = console;
if (apiUrl) { if (apiUrl) {
this.userManager = new UserManager({ this.userManager = new UserManager({
client_id: 'squidex-frontend', client_id: 'squidex-frontend',
scope: 'squidex-api openid profile ', scope: 'squidex-api openid profile ',
response_type: 'id_token token', response_type: 'id_token token',
silent_redirect_uri: apiUrl.buildUrl('identity-server/client-callback-silent/'), redirect_uri: apiUrl.buildUrl('/login;'),
popup_redirect_uri: apiUrl.buildUrl('identity-server/client-callback-popup/'), post_logout_redirect_uri: apiUrl.buildUrl('/logout;'),
authority: apiUrl.buildUrl('identity-server/'), silent_redirect_uri: apiUrl.buildUrl('identity-server/client-callback-silent/'),
automaticSilentRenew: true popup_redirect_uri: apiUrl.buildUrl('identity-server/client-callback-popup/'),
authority: apiUrl.buildUrl('identity-server/'),
automaticSilentRenew: true
}); });
this.userManager.events.addUserLoaded(user => { this.userManager.events.addUserLoaded(user => {
@ -82,17 +85,19 @@ export class AuthService {
} }
public logout(): Observable<any> { public logout(): Observable<any> {
return Observable.fromPromise(this.userManager.signoutRedirect());
}
public logoutComplete(): Observable<any> {
return Observable.fromPromise(this.userManager.signoutRedirectCallback()); return Observable.fromPromise(this.userManager.signoutRedirectCallback());
} }
public login(): Observable<boolean> { public login(): Observable<any> {
const userPromise = return Observable.fromPromise(this.userManager.signinRedirect());
this.checkState(this.userManager.signinSilent()) }
.then(result => {
return result || this.checkState(this.userManager.signinPopup());
});
return Observable.fromPromise(userPromise); public loginComplete(): Observable<any> {
return Observable.fromPromise(this.userManager.signinRedirectCallback());
} }
private onAuthenticated(user: User) { private onAuthenticated(user: User) {

Loading…
Cancel
Save