refresh token support
This commit is contained in:
parent
65d10685a4
commit
2312f21d77
@ -17,8 +17,11 @@ export class AuthHandlerInterceptor implements HttpInterceptor {
|
|||||||
constructor(private tokenService: TokenService, private messageService: MessageService) {}
|
constructor(private tokenService: TokenService, private messageService: MessageService) {}
|
||||||
|
|
||||||
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
|
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
|
||||||
const token = localStorage.getItem(TokenService.Id_Token_Key)
|
const token = localStorage.getItem(TokenService.Id_AuthToken_Key)
|
||||||
if (request.url.includes(serviceBaseUrl) && token) {
|
if (request.url.includes(serviceBaseUrl) && token) {
|
||||||
|
this.messageService.add("start refresh of tokens")
|
||||||
|
this.tokenService.refresh()
|
||||||
|
|
||||||
this.messageService.add("api request intercepted")
|
this.messageService.add("api request intercepted")
|
||||||
const clone = request.clone({
|
const clone = request.clone({
|
||||||
setHeaders: { Authorization: `Bearer ${token}`}
|
setHeaders: { Authorization: `Bearer ${token}`}
|
||||||
|
@ -4,12 +4,20 @@ import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|||||||
import { UserCreds } from './userCreds'
|
import { UserCreds } from './userCreds'
|
||||||
import jwt_decode from 'jwt-decode'
|
import jwt_decode from 'jwt-decode'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
interface TokenTuple {
|
||||||
|
authToken: string
|
||||||
|
refreshToken: string
|
||||||
|
}
|
||||||
|
|
||||||
@Injectable({
|
@Injectable({
|
||||||
providedIn: 'root'
|
providedIn: 'root'
|
||||||
})
|
})
|
||||||
export class TokenService {
|
export class TokenService {
|
||||||
|
|
||||||
public static Id_Token_Key : string = "id_token";
|
public static Id_AuthToken_Key : string = "id_authtoken";
|
||||||
|
public static Id_RefreshToken_Key : string = "id_refreshtoken";
|
||||||
|
|
||||||
constructor(private http: HttpClient, private messageService: MessageService) {
|
constructor(private http: HttpClient, private messageService: MessageService) {
|
||||||
}
|
}
|
||||||
@ -17,7 +25,7 @@ export class TokenService {
|
|||||||
checkAuthenticated(): boolean {
|
checkAuthenticated(): boolean {
|
||||||
let result: boolean = false
|
let result: boolean = false
|
||||||
|
|
||||||
const token = localStorage.getItem(TokenService.Id_Token_Key)
|
const token = localStorage.getItem(TokenService.Id_AuthToken_Key)
|
||||||
if (token) {
|
if (token) {
|
||||||
let expiration = jwt_decode(token)["exp"]
|
let expiration = jwt_decode(token)["exp"]
|
||||||
if ((expiration * 1000) > Date.now()) {
|
if ((expiration * 1000) > Date.now()) {
|
||||||
@ -31,7 +39,8 @@ export class TokenService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logout() {
|
logout() {
|
||||||
localStorage.removeItem(TokenService.Id_Token_Key)
|
localStorage.removeItem(TokenService.Id_AuthToken_Key)
|
||||||
|
localStorage.removeItem(TokenService.Id_RefreshToken_Key)
|
||||||
this.messageService.add("Token removed from local storage")
|
this.messageService.add("Token removed from local storage")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,13 +51,33 @@ export class TokenService {
|
|||||||
"login": login,
|
"login": login,
|
||||||
"password": password
|
"password": password
|
||||||
}
|
}
|
||||||
const token = await this.http.post(
|
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
|
||||||
"https://authservice.hottis.de/token",
|
"https://authservice.hottis.de/refreshable",
|
||||||
userCreds,
|
userCreds
|
||||||
{responseType:'text'}
|
|
||||||
).toPromise()
|
).toPromise()
|
||||||
localStorage.setItem(TokenService.Id_Token_Key, token)
|
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
|
||||||
|
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
|
||||||
this.messageService.add("Token saved")
|
this.messageService.add("Token saved")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async refresh() {
|
||||||
|
try {
|
||||||
|
this.messageService.add(`TokenService: trying to refresh tokens`);
|
||||||
|
const refreshToken = localStorage.getItem(TokenService.Id_RefreshToken_Key)
|
||||||
|
const tokenTuple: TokenTuple = await this.http.post<TokenTuple>(
|
||||||
|
"https://authservice.hottis.de/refresh",
|
||||||
|
refreshToken
|
||||||
|
).toPromise()
|
||||||
|
localStorage.setItem(TokenService.Id_AuthToken_Key, tokenTuple.authToken)
|
||||||
|
localStorage.setItem(TokenService.Id_RefreshToken_Key, tokenTuple.refreshToken)
|
||||||
|
this.messageService.add("Token saved")
|
||||||
|
} catch (err) {
|
||||||
|
this.messageService.add(`error when trying to refresh: ${ JSON.stringify(err, undefined, 4)}`)
|
||||||
|
localStorage.removeItem(TokenService.Id_AuthToken_Key)
|
||||||
|
localStorage.removeItem(TokenService.Id_RefreshToken_Key)
|
||||||
|
this.messageService.add("Token removed from local storage")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user