Compare commits

..

No commits in common. "4c71a076e7d859eaa1550b4cdc6fd7cb0c82d7ab" and "dc0b24a03f0b7611f65c42fe18d31f8c5095389c" have entirely different histories.

4 changed files with 7 additions and 39 deletions

View file

@ -69,9 +69,8 @@
</app-settings-content>
</div>
<div class="py-4 mt-8 flex flex-wrap gap-2">
<ui-btn v-if="!isGuest" color="bg-primary flex items-center text-lg" :disabled="loggingOut" @click="logout(true)"> <span class="material-symbols mr-4 icon-text">devices</span>{{ $strings.ButtonLogoutAllDevices }} </ui-btn>
<ui-btn color="bg-primary flex items-center text-lg" :disabled="loggingOut" @click="logout"><span class="material-symbols mr-4 icon-text">logout</span>{{ $strings.ButtonLogout }}</ui-btn>
<div class="py-4 mt-8 flex">
<ui-btn color="bg-primary flex items-center text-lg" @click="logout"><span class="material-symbols mr-4 icon-text">logout</span>{{ $strings.ButtonLogout }}</ui-btn>
</div>
<modals-emails-user-e-reader-device-modal v-model="showEReaderDeviceModal" :existing-devices="revisedEreaderDevices" :ereader-device="selectedEReaderDevice" @update="ereaderDevicesUpdated" />
@ -88,7 +87,6 @@ export default {
newPassword: null,
confirmPassword: null,
changingPassword: false,
loggingOut: false,
selectedLanguage: '',
newEReaderDevice: {
name: '',
@ -137,7 +135,7 @@ export default {
updateLocalLanguage(lang) {
this.$setLanguageCode(lang)
},
logout(allDevices = false) {
logout() {
// Disconnect from socket
if (this.$root.socket) {
console.log('Disconnecting from socket', this.$root.socket.id)
@ -151,10 +149,8 @@ export default {
this.$store.commit('libraries/setUserPlaylists', [])
this.$store.commit('libraries/setCollections', [])
this.loggingOut = true
const url = allDevices ? '/logout?allDevices=1' : '/logout'
this.$axios
.$post(url)
.$post('/logout')
.then((logoutPayload) => {
const redirect_url = logoutPayload.redirect_url
@ -167,9 +163,6 @@ export default {
.catch((error) => {
console.error(error)
})
.finally(() => {
this.loggingOut = false
})
},
resetForm() {
this.password = null

View file

@ -46,7 +46,6 @@
"ButtonLatest": "Latest",
"ButtonLibrary": "Library",
"ButtonLogout": "Logout",
"ButtonLogoutAllDevices": "Logout All Devices",
"ButtonLookup": "Lookup",
"ButtonManageTracks": "Manage Tracks",
"ButtonMapChapterTitles": "Map Chapter Titles",

View file

@ -471,23 +471,18 @@ class Auth {
res.json(openIdIssuerConfig)
})
/**
* Logout route
* Use ?allDevices=1 to destroy every session for this user instead of just the current one
*/
// Logout route
router.post('/logout', async (req, res) => {
// Refresh token be alternatively be sent in the header
const refreshToken = req.cookies.refresh_token || req.headers['x-refresh-token']
const allDevices = req.query.allDevices === '1'
// Clear refresh token cookie
res.clearCookie('refresh_token', {
path: '/'
})
if (allDevices) {
await this.tokenManager.invalidateAllSessionsForRefreshToken(refreshToken)
} else if (refreshToken) {
// Invalidate the session in database using refresh token
if (refreshToken) {
await this.tokenManager.invalidateRefreshToken(refreshToken)
} else {
Logger.info(`[Auth] logout: No refresh token on request`)

View file

@ -505,25 +505,6 @@ class TokenManager {
return null
}
/**
* Destroy all JWT sessions for the user that owns this refresh token
*
* @param {string} refreshToken
*/
async invalidateAllSessionsForRefreshToken(refreshToken) {
if (!refreshToken) return
const session = await Database.sessionModel.findOne({
where: {
[Op.or]: [{ refreshToken: refreshToken }, { lastRefreshToken: refreshToken }]
}
})
if (!session) return
const numDeleted = await Database.sessionModel.destroy({ where: { userId: session.userId } })
Logger.info(`[TokenManager] Invalidated all JWT sessions for user ${session.userId}, ${numDeleted} deleted`)
}
/**
* Invalidate a refresh token - used for logout
*