Directly redirect to the openid auth provider if that's the only auth method

This commit is contained in:
kolaente 2021-08-15 12:02:29 +02:00
parent a5687d78f5
commit 3aa316988b
No known key found for this signature in database
GPG key ID: F40E70337AB24C9B
5 changed files with 49 additions and 16 deletions

View file

@ -56,7 +56,9 @@ export default {
}, },
beforeCreate() { beforeCreate() {
this.$store.dispatch('config/update') this.$store.dispatch('config/update')
.then(() => {
this.$store.dispatch('auth/checkAuth') this.$store.dispatch('auth/checkAuth')
})
setLanguage() setLanguage()
}, },

View file

@ -0,0 +1,13 @@
interface Provider {
name: string
key: string
authUrl: string
clientId: string
}
export const redirectToProvider = (provider: Provider, redirectUrl: string) => {
const state = Math.random().toString(36).substring(2, 24)
localStorage.setItem('state', state)
window.location.href = `${provider.authUrl}?client_id=${provider.clientId}&redirect_uri=${redirectUrl}${provider.key}&response_type=code&scope=openid email profile&state=${state}`
}

View file

@ -189,6 +189,7 @@ export default {
ctx.commit('authenticated', authenticated) ctx.commit('authenticated', authenticated)
if (!authenticated) { if (!authenticated) {
ctx.commit('info', null) ctx.commit('info', null)
ctx.dispatch('config/redirectToProviderIfNothingElseIsEnabled', null, {root: true})
} }
return Promise.resolve() return Promise.resolve()

View file

@ -3,6 +3,7 @@ import Vue from 'vue'
import {CONFIG} from '../mutation-types' import {CONFIG} from '../mutation-types'
import {HTTPFactory} from '@/http-common' import {HTTPFactory} from '@/http-common'
import {objectToCamelCase} from '@/helpers/case' import {objectToCamelCase} from '@/helpers/case'
import {redirectToProvider} from '../../helpers/redirectToProvider'
export default { export default {
namespaced: true, namespaced: true,
@ -69,5 +70,15 @@ export default {
}) })
.catch(e => Promise.reject(e)) .catch(e => Promise.reject(e))
}, },
redirectToProviderIfNothingElseIsEnabled(ctx) {
if (ctx.state.auth.local.enabled === false &&
ctx.state.auth.openidConnect.enabled &&
ctx.state.auth.openidConnect.providers &&
ctx.state.auth.openidConnect.providers.length === 1 &&
window.location.pathname.startsWith('/login') // Kinda hacky, but prevents an endless loop.
) {
redirectToProvider(ctx.state.auth.openidConnect.providers[0], ctx.state.auth.openidConnect.redirectUrl)
}
},
}, },
} }

View file

@ -83,7 +83,7 @@
</form> </form>
<div <div
v-if="hasApiUrl && openidConnect.enabled && openidConnect.providers && openidConnect.providers.length > 0" v-if="hasOpenIdProviders"
class="mt-4"> class="mt-4">
<x-button <x-button
@click="redirectToProvider(p)" @click="redirectToProvider(p)"
@ -110,6 +110,7 @@ import {ERROR_MESSAGE, LOADING} from '@/store/mutation-types'
import legal from '../../components/misc/legal' import legal from '../../components/misc/legal'
import ApiConfig from '@/components/misc/api-config.vue' import ApiConfig from '@/components/misc/api-config.vue'
import {getErrorText} from '@/message' import {getErrorText} from '@/message'
import {redirectToProvider} from '../../helpers/redirectToProvider'
export default { export default {
components: { components: {
@ -150,7 +151,14 @@ export default {
this.hasApiUrl = window.API_URL !== '' this.hasApiUrl = window.API_URL !== ''
this.setTitle(this.$t('user.auth.login')) this.setTitle(this.$t('user.auth.login'))
}, },
computed: mapState({ computed: {
hasOpenIdProviders() {
return this.hasApiUrl &&
this.openidConnect.enabled &&
this.openidConnect.providers &&
this.openidConnect.providers.length > 0
},
...mapState({
registrationEnabled: state => state.config.registrationEnabled, registrationEnabled: state => state.config.registrationEnabled,
loading: LOADING, loading: LOADING,
errorMessage: ERROR_MESSAGE, errorMessage: ERROR_MESSAGE,
@ -159,6 +167,7 @@ export default {
localAuthEnabled: state => state.config.auth.local.enabled, localAuthEnabled: state => state.config.auth.local.enabled,
openidConnect: state => state.config.auth.openidConnect, openidConnect: state => state.config.auth.openidConnect,
}), }),
},
methods: { methods: {
setLoading() { setLoading() {
const timeout = setTimeout(() => { const timeout = setTimeout(() => {
@ -202,10 +211,7 @@ export default {
}) })
}, },
redirectToProvider(provider) { redirectToProvider(provider) {
const state = Math.random().toString(36).substring(2, 24) redirectToProvider(provider, this.openidConnect.redirectUrl)
localStorage.setItem('state', state)
window.location.href = `${provider.authUrl}?client_id=${provider.clientId}&redirect_uri=${this.openidConnect.redirectUrl}${provider.key}&response_type=code&scope=openid email profile&state=${state}`
}, },
}, },
} }