X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fcore%2Fauth%2Fauth.service.ts;h=4213da20c065211f2468d23a4149d726dcb80be3;hb=cd4d7a2ca868209fb1e2dbd790c1e5d6cca77e86;hp=6223cde6d1501ddd17803b7b9b9a839f98a3a37f;hpb=47f8de28346a7aa28425265f316dc26bf2376c45;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts index 6223cde6d..4213da20c 100644 --- a/client/src/app/core/auth/auth.service.ts +++ b/client/src/app/core/auth/auth.service.ts @@ -1,14 +1,9 @@ +import { Observable, ReplaySubject, Subject, throwError as observableThrowError } from 'rxjs' +import { catchError, map, mergeMap, tap } from 'rxjs/operators' import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http' import { Injectable } from '@angular/core' import { Router } from '@angular/router' import { NotificationsService } from 'angular2-notifications' -import 'rxjs/add/observable/throw' -import 'rxjs/add/operator/do' -import 'rxjs/add/operator/map' -import 'rxjs/add/operator/mergeMap' -import { Observable } from 'rxjs/Observable' -import { ReplaySubject } from 'rxjs/ReplaySubject' -import { Subject } from 'rxjs/Subject' import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared' import { User } from '../../../../../shared/models/users' import { UserLogin } from '../../../../../shared/models/users/user-login.model' @@ -16,6 +11,7 @@ import { environment } from '../../../environments/environment' import { RestExtractor } from '../../shared/rest' import { AuthStatus } from './auth-status.model' import { AuthUser } from './auth-user.model' +import { objectToUrlEncoded } from '@app/shared/misc/utils' interface UserLoginWithUsername extends UserLogin { access_token: string @@ -46,7 +42,7 @@ export class AuthService { private notificationsService: NotificationsService, private restExtractor: RestExtractor, private router: Router - ) { + ) { this.loginChanged = new Subject() this.loginChangedSource = this.loginChanged.asObservable() @@ -58,28 +54,28 @@ export class AuthService { // Fetch the client_id/client_secret // FIXME: save in local storage? this.http.get(AuthService.BASE_CLIENT_URL) - .catch(res => this.restExtractor.handleError(res)) - .subscribe( - res => { - this.clientId = res.client_id - this.clientSecret = res.client_secret - console.log('Client credentials loaded.') - }, - - error => { - let errorMessage = error.message - - if (error.status === 403) { - errorMessage = `Cannot retrieve OAuth Client credentials: ${error.text}. \n` - errorMessage += 'Ensure you have correctly configured PeerTube (config/ directory), ' + - 'in particular the "webserver" section.' - } - - // We put a bigger timeout - // This is an important message - this.notificationsService.error('Error', errorMessage, { timeOut: 7000 }) - } - ) + .pipe(catchError(res => this.restExtractor.handleError(res))) + .subscribe( + res => { + this.clientId = res.client_id + this.clientSecret = res.client_secret + console.log('Client credentials loaded.') + }, + + error => { + let errorMessage = error.message + + if (error.status === 403) { + errorMessage = `Cannot retrieve OAuth Client credentials: ${error.text}. \n` + errorMessage += 'Ensure you have correctly configured PeerTube (config/ directory), ' + + 'in particular the "webserver" section.' + } + + // We put a bigger timeout + // This is an important message + this.notificationsService.error('Error', errorMessage, { timeOut: 7000 }) + } + ) } getRefreshToken () { @@ -118,21 +114,24 @@ export class AuthService { login (username: string, password: string) { // Form url encoded - const body = new URLSearchParams() - body.set('client_id', this.clientId) - body.set('client_secret', this.clientSecret) - body.set('response_type', 'code') - body.set('grant_type', 'password') - body.set('scope', 'upload') - body.set('username', username) - body.set('password', password) + const body = { + client_id: this.clientId, + client_secret: this.clientSecret, + response_type: 'code', + grant_type: 'password', + scope: 'upload', + username, + password + } const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') - return this.http.post(AuthService.BASE_TOKEN_URL, body.toString(), { headers }) - .map(res => Object.assign(res, { username })) - .flatMap(res => this.mergeUserInformation(res)) - .map(res => this.handleLogin(res)) - .catch(res => this.restExtractor.handleError(res)) + return this.http.post(AuthService.BASE_TOKEN_URL, objectToUrlEncoded(body), { headers }) + .pipe( + map(res => Object.assign(res, { username })), + mergeMap(res => this.mergeUserInformation(res)), + map(res => this.handleLogin(res)), + catchError(res => this.restExtractor.handleError(res)) + ) } logout () { @@ -161,20 +160,22 @@ export class AuthService { const headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') this.refreshingTokenObservable = this.http.post(AuthService.BASE_TOKEN_URL, body, { headers }) - .map(res => this.handleRefreshToken(res)) - .do(() => this.refreshingTokenObservable = null) - .catch(err => { - this.refreshingTokenObservable = null - - console.error(err) - console.log('Cannot refresh token -> logout...') - this.logout() - this.router.navigate([ '/login' ]) - - return Observable.throw({ - error: 'You need to reconnect.' - }) - }) + .pipe( + map(res => this.handleRefreshToken(res)), + tap(() => this.refreshingTokenObservable = null), + catchError(err => { + this.refreshingTokenObservable = null + + console.error(err) + console.log('Cannot refresh token -> logout...') + this.logout() + this.router.navigate([ '/login' ]) + + return observableThrowError({ + error: 'You need to reconnect.' + }) + }) + ) return this.refreshingTokenObservable } @@ -188,14 +189,14 @@ export class AuthService { } this.mergeUserInformation(obj) - .subscribe( - res => { - this.user.patch(res) - this.user.save() + .subscribe( + res => { + this.user.patch(res) + this.user.save() - this.userInformationLoaded.next(true) - } - ) + this.userInformationLoaded.next(true) + } + ) } private mergeUserInformation (obj: UserLoginWithUsername): Observable { @@ -203,7 +204,7 @@ export class AuthService { const headers = new HttpHeaders().set('Authorization', `${obj.token_type} ${obj.access_token}`) return this.http.get(AuthService.BASE_USER_INFORMATION_URL, { headers }) - .map(res => Object.assign(obj, res)) + .pipe(map(res => Object.assign(obj, res))) } private handleLogin (obj: UserLoginWithUserInformation) {