diff --git a/changes/changelog.d/407.enhancement b/changes/changelog.d/407.enhancement
new file mode 100644
index 0000000000000000000000000000000000000000..c21a34063e1b6b1930c7af15a5cfd5d72f218bb4
--- /dev/null
+++ b/changes/changelog.d/407.enhancement
@@ -0,0 +1 @@
+Confirm email without requiring the user to validate the form manually (#407)
\ No newline at end of file
diff --git a/front/src/EmbedFrame.vue b/front/src/EmbedFrame.vue
index a8dcce4fa01d9511831cf4cbf4936d97c42b8e58..afee7c82f927d8d79cd7fe84afe4c81cfc31eba8 100644
--- a/front/src/EmbedFrame.vue
+++ b/front/src/EmbedFrame.vue
@@ -89,7 +89,6 @@
           <tr
             :id="'queue-item-' + index"
             role="button"
-            tabindex="0"
             v-if="track.sources.length > 0"
             :key="index"
             :class="[{active: index === currentIndex}]"
diff --git a/front/src/components/auth/LoginForm.vue b/front/src/components/auth/LoginForm.vue
index f0591a5385d36c59dd64fc556c5e5fe6ccb03abe..3f6eb0edb1a6720f4eed19b6a38a87d988f5391c 100644
--- a/front/src/components/auth/LoginForm.vue
+++ b/front/src/components/auth/LoginForm.vue
@@ -40,7 +40,7 @@
             <translate translate-context="*/Login/*/Verb">Reset your password</translate>
           </router-link>
         </label>
-        <password-input :index="2" required v-model="credentials.password" />
+        <password-input required v-model="credentials.password" />
 
       </div>
     </template>
diff --git a/front/src/components/forms/PasswordInput.vue b/front/src/components/forms/PasswordInput.vue
index fe1a01a9ff688a599f6ca96af9061ecc12e675b5..2e4f227a59f879006d97846ae2d7a99002e85ec8 100644
--- a/front/src/components/forms/PasswordInput.vue
+++ b/front/src/components/forms/PasswordInput.vue
@@ -3,7 +3,6 @@
     <input
     required
     name="password"
-    :tabindex="index"
     :type="passwordInputType"
     @input="$emit('input', $event.target.value)"
     :value="value">
@@ -30,7 +29,7 @@ function copyStringToClipboard (str) {
 }
 
 export default {
-  props: ['value', 'index', 'defaultShow', 'copyButton'],
+  props: ['value', 'defaultShow', 'copyButton'],
   data () {
     return {
       showPassword: this.defaultShow || false,
diff --git a/front/src/views/auth/EmailConfirm.vue b/front/src/views/auth/EmailConfirm.vue
index 26ccc5d70ced38e42a2c23b26bd4094c239bad3d..4e255ffb9c454f0eb2f7fdb55af4343e93c926d0 100644
--- a/front/src/views/auth/EmailConfirm.vue
+++ b/front/src/views/auth/EmailConfirm.vue
@@ -52,6 +52,11 @@ export default {
       }
     }
   },
+  mounted () {
+    if (this.key) {
+      this.submit()
+    }
+  },
   methods: {
     submit() {
       let self = this