mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-19 21:03:17 -07:00
Kick out the user when the user has been invalidated. This should solve a few issues with "still being logged in"
This commit is contained in:
parent
a4bbb8853b
commit
87233a7fd3
4 changed files with 48 additions and 31 deletions
|
@ -1,5 +1,5 @@
|
||||||
import { CommonModule, PlatformLocation, APP_BASE_HREF } from "@angular/common";
|
import { CommonModule, PlatformLocation, APP_BASE_HREF } from "@angular/common";
|
||||||
import { HttpClient, HttpClientModule } from "@angular/common/http";
|
import { HttpClient, HttpClientModule, HTTP_INTERCEPTORS } from "@angular/common/http";
|
||||||
import { NgModule } from "@angular/core";
|
import { NgModule } from "@angular/core";
|
||||||
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
||||||
import { BrowserModule } from "@angular/platform-browser";
|
import { BrowserModule } from "@angular/platform-browser";
|
||||||
|
@ -66,6 +66,7 @@ import { StorageService } from "./shared/storage/storage-service";
|
||||||
import { SignalRNotificationService } from "./services/signlarnotification.service";
|
import { SignalRNotificationService } from "./services/signlarnotification.service";
|
||||||
import { MatMenuModule } from "@angular/material/menu";
|
import { MatMenuModule } from "@angular/material/menu";
|
||||||
import { RemainingRequestsComponent } from "./shared/remaining-requests/remaining-requests.component";
|
import { RemainingRequestsComponent } from "./shared/remaining-requests/remaining-requests.component";
|
||||||
|
import { UnauthorizedInterceptor } from "./auth/unauthorized.interceptor";
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{ path: "*", component: PageNotFoundComponent },
|
{ path: "*", component: PageNotFoundComponent },
|
||||||
|
@ -196,6 +197,11 @@ export function JwtTokenGetter() {
|
||||||
{
|
{
|
||||||
provide: APP_BASE_HREF,
|
provide: APP_BASE_HREF,
|
||||||
useValue: window["baseHref"]
|
useValue: window["baseHref"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
provide: HTTP_INTERCEPTORS,
|
||||||
|
useClass: UnauthorizedInterceptor,
|
||||||
|
multi: true
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent],
|
bootstrap: [AppComponent],
|
||||||
|
|
29
src/Ombi/ClientApp/src/app/auth/unauthorized.interceptor.ts
Normal file
29
src/Ombi/ClientApp/src/app/auth/unauthorized.interceptor.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { Injectable } from '@angular/core';
|
||||||
|
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from '@angular/common/http';
|
||||||
|
import { Observable, Subject, throwError } from 'rxjs';
|
||||||
|
import { catchError, throttleTime } from 'rxjs/operators';
|
||||||
|
import { AuthService } from './auth.service';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class UnauthorizedInterceptor implements HttpInterceptor {
|
||||||
|
|
||||||
|
private throttleLogout = new Subject();
|
||||||
|
constructor(private authService: AuthService, private router: Router) {
|
||||||
|
this.throttleLogout.pipe(throttleTime(5000)).subscribe(url => {
|
||||||
|
this.authService.logout();
|
||||||
|
this.router.navigate(["login"]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
|
||||||
|
return next.handle(request).pipe(
|
||||||
|
catchError((response: HttpErrorResponse) => {
|
||||||
|
if (response.status === 401) {
|
||||||
|
this.throttleLogout.next();
|
||||||
|
}
|
||||||
|
return throwError(response);
|
||||||
|
}
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +0,0 @@
|
||||||
export function getBaseLocation() {
|
|
||||||
debugger;
|
|
||||||
let paths: string[] = location.pathname.split('/').splice(1, 1);
|
|
||||||
let basePath: string = (paths && paths[0] ? paths[0] : "");
|
|
||||||
if(invalidProxies.indexOf(basePath.toUpperCase()) === -1){
|
|
||||||
return '/' + basePath;
|
|
||||||
}
|
|
||||||
return '/';
|
|
||||||
}
|
|
||||||
|
|
||||||
const invalidProxies: string[] = [
|
|
||||||
'DISCOVER',
|
|
||||||
'REQUESTS-LIST',
|
|
||||||
'SETTINGS',
|
|
||||||
'ISSUES',
|
|
||||||
'USERMANAGEMENT',
|
|
||||||
'RECENTLYADDED',
|
|
||||||
'DETAILS',
|
|
||||||
'VOTE',
|
|
||||||
'LOGIN',
|
|
||||||
'LANDINGPAGE',
|
|
||||||
'TOKEN',
|
|
||||||
'RESET',
|
|
||||||
'CUSTOM',
|
|
||||||
'AUTH',
|
|
||||||
'WIZARD',
|
|
||||||
"CALENDAR"
|
|
||||||
]
|
|
|
@ -1,5 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
@ -9,6 +10,7 @@ using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using Microsoft.OpenApi.Models;
|
using Microsoft.OpenApi.Models;
|
||||||
using Ombi.Config;
|
using Ombi.Config;
|
||||||
|
using Ombi.Core.Authentication;
|
||||||
using Ombi.Helpers;
|
using Ombi.Helpers;
|
||||||
using Ombi.Models.Identity;
|
using Ombi.Models.Identity;
|
||||||
|
|
||||||
|
@ -102,7 +104,6 @@ namespace Ombi
|
||||||
OnMessageReceived = context =>
|
OnMessageReceived = context =>
|
||||||
{
|
{
|
||||||
var accessToken = context.Request.Query["access_token"];
|
var accessToken = context.Request.Query["access_token"];
|
||||||
|
|
||||||
// If the request is for our hub...
|
// If the request is for our hub...
|
||||||
var path = context.HttpContext.Request.Path;
|
var path = context.HttpContext.Request.Path;
|
||||||
if (!string.IsNullOrEmpty(accessToken) &&
|
if (!string.IsNullOrEmpty(accessToken) &&
|
||||||
|
@ -111,8 +112,17 @@ namespace Ombi
|
||||||
// Read the token out of the query string
|
// Read the token out of the query string
|
||||||
context.Token = accessToken;
|
context.Token = accessToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
},
|
||||||
|
OnTokenValidated = async context =>
|
||||||
|
{
|
||||||
|
var userid = context.Principal?.Claims?.Where(x => x.Type.Equals("id", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault()?.Value ?? default;
|
||||||
|
var um = context.HttpContext.RequestServices.GetRequiredService<OmbiUserManager>();
|
||||||
|
var user = await um.FindByIdAsync(userid);
|
||||||
|
if (user == null)
|
||||||
|
{
|
||||||
|
context.Fail("invaild token");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue