airsonic-refix/src/auth/service.ts
2020-09-19 13:07:59 +02:00

78 lines
2.1 KiB
TypeScript

import axios from 'axios'
import { randomString, md5 } from '@/shared/utils'
import { config } from '@/shared/config'
export class AuthService {
public server = '';
public username = '';
public salt = '';
public hash = '';
private authenticated = false;
constructor() {
this.server = config.serverUrl || localStorage.getItem('server') || ''
this.username = localStorage.getItem('username') || ''
this.salt = localStorage.getItem('salt') || ''
this.hash = localStorage.getItem('hash') || ''
}
private saveSession() {
if (!config.serverUrl) {
localStorage.setItem('server', this.server)
}
localStorage.setItem('username', this.username)
localStorage.setItem('salt', this.salt)
localStorage.setItem('hash', this.hash)
}
async autoLogin(): Promise<boolean> {
if (!this.server || !this.username) {
return false
}
return this.loginWithHash(this.server, this.username, this.salt, this.hash, false)
.then(() => true)
.catch(() => false)
}
async loginWithPassword(server: string, username: string, password: string, remember: boolean) {
const salt = randomString()
const hash = md5(password + salt)
return this.loginWithHash(server, username, salt, hash, remember)
}
private async loginWithHash(
server: string,
username: string,
salt: string,
hash: string,
remember: boolean
) {
const url = `${server}/rest/ping.view?u=${username}&s=${salt}&t=${hash}&v=1.15.0&c=app&f=json`
return axios.get(url)
.then((response) => {
const subsonicResponse = response.data['subsonic-response']
if (!subsonicResponse || subsonicResponse.status !== 'ok') {
const err = new Error(subsonicResponse.status)
return Promise.reject(err)
}
this.authenticated = true
this.server = server
this.username = username
this.salt = salt
this.hash = hash
if (remember) {
this.saveSession()
}
})
}
logout() {
localStorage.clear()
sessionStorage.clear()
}
isAuthenticated() {
return this.authenticated
}
}