X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=client%2Fsrc%2Fapp%2Fcore%2Fauth%2Fauth.service.ts;h=f5ca2fcdc9d088c582702d286919082d2340ea3f;hb=bf9ae5ce57c9e2117548ab5794c0c2a5096ba4ad;hp=0aa276c693b4d866baecd6818f54741487d51991;hpb=1e1265b36c09df1465aa2b4866815c957b6a532e;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 0aa276c69..f5ca2fcdc 100644 --- a/client/src/app/core/auth/auth.service.ts +++ b/client/src/app/core/auth/auth.service.ts @@ -1,29 +1,21 @@ +import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http' import { Injectable } from '@angular/core' import { Router } from '@angular/router' -import { Observable } from 'rxjs/Observable' -import { Subject } from 'rxjs/Subject' -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http' -import { ReplaySubject } from 'rxjs/ReplaySubject' +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 'rxjs/add/observable/throw' - -import { NotificationsService } from 'angular2-notifications' - +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' +import { environment } from '../../../environments/environment' +import { RestExtractor } from '../../shared/rest' import { AuthStatus } from './auth-status.model' import { AuthUser } from './auth-user.model' -import { - OAuthClientLocal, - UserRole, - UserRefreshToken, - VideoChannel, - User as UserServerModel -} from '../../../../../shared' -// Do not use the barrel (dependency loop) -import { RestExtractor } from '../../shared/rest' -import { UserLogin } from '../../../../../shared/models/users/user-login.model' -import { UserConstructorHash } from '../../shared/users/user.model' interface UserLoginWithUsername extends UserLogin { access_token: string @@ -32,28 +24,13 @@ interface UserLoginWithUsername extends UserLogin { username: string } -interface UserLoginWithUserInformation extends UserLogin { - access_token: string - refresh_token: string - token_type: string - username: string - id: number - role: UserRole - displayNSFW: boolean - email: string - videoQuota: number - account: { - id: number - uuid: string - } - videoChannels: VideoChannel[] -} +type UserLoginWithUserInformation = UserLoginWithUsername & User @Injectable() export class AuthService { - private static BASE_CLIENT_URL = API_URL + '/api/v1/oauth-clients/local' - private static BASE_TOKEN_URL = API_URL + '/api/v1/users/token' - private static BASE_USER_INFORMATION_URL = API_URL + '/api/v1/users/me' + private static BASE_CLIENT_URL = environment.apiUrl + '/api/v1/oauth-clients/local' + private static BASE_TOKEN_URL = environment.apiUrl + '/api/v1/users/token' + private static BASE_USER_INFORMATION_URL = environment.apiUrl + '/api/v1/users/me' loginChangedSource: Observable userInformationLoaded = new ReplaySubject(1) @@ -135,17 +112,17 @@ export class AuthService { login (username: string, password: string) { // Form url encoded - const body = new HttpParams().set('client_id', this.clientId) - .set('client_secret', this.clientSecret) - .set('response_type', 'code') - .set('grant_type', 'password') - .set('scope', 'upload') - .set('username', username) - .set('password', password) + 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 headers = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded') - - return this.http.post(AuthService.BASE_TOKEN_URL, body, { headers }) + 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)) @@ -177,19 +154,15 @@ export class AuthService { return this.http.post(AuthService.BASE_TOKEN_URL, body, { headers }) .map(res => this.handleRefreshToken(res)) - .catch(res => { - // The refresh token is invalid? - if (res.status === 400 && res.error.error === 'invalid_grant') { - console.error('Cannot refresh token -> logout...') - this.logout() - this.router.navigate(['/login']) - - return Observable.throw({ - error: 'You need to reconnect.' - }) - } - - return this.restExtractor.handleError(res) + .catch(err => { + console.error(err) + console.log('Cannot refresh token -> logout...') + this.logout() + this.router.navigate(['/login']) + + return Observable.throw({ + error: 'You need to reconnect.' + }) }) } @@ -202,15 +175,12 @@ export class AuthService { } this.mergeUserInformation(obj) - .do(() => this.userInformationLoaded.next(true)) .subscribe( res => { - this.user.displayNSFW = res.displayNSFW - this.user.role = res.role - this.user.videoChannels = res.videoChannels - this.user.account = res.account - + this.user.patch(res) this.user.save() + + this.userInformationLoaded.next(true) } ) } @@ -220,43 +190,21 @@ 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 => { - const newProperties = { - id: res.id, - role: res.role, - displayNSFW: res.displayNSFW, - email: res.email, - videoQuota: res.videoQuota, - account: res.account, - videoChannels: res.videoChannels - } - - return Object.assign(obj, newProperties) - } - ) + .map(res => Object.assign(obj, res)) } private handleLogin (obj: UserLoginWithUserInformation) { - const hashUser: UserConstructorHash = { - id: obj.id, - username: obj.username, - role: obj.role, - email: obj.email, - displayNSFW: obj.displayNSFW, - videoQuota: obj.videoQuota, - videoChannels: obj.videoChannels, - account: obj.account - } const hashTokens = { accessToken: obj.access_token, tokenType: obj.token_type, refreshToken: obj.refresh_token } - this.user = new AuthUser(hashUser, hashTokens) + this.user = new AuthUser(obj, hashTokens) this.user.save() this.setStatus(AuthStatus.LoggedIn) + this.userInformationLoaded.next(true) } private handleRefreshToken (obj: UserRefreshToken) {