✨ Can pick up mfa request
This commit is contained in:
parent
ebdb6f5688
commit
38ee30f455
2
.idea/dataSources.local.xml
generated
2
.idea/dataSources.local.xml
generated
@ -2,7 +2,7 @@
|
|||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="dataSourceStorageLocal" created-in="GO-241.18034.61">
|
<component name="dataSourceStorageLocal" created-in="GO-241.18034.61">
|
||||||
<data-source name="hy_passport@localhost" uuid="74bcf3ef-a2b9-435b-b9e5-f32902a33b25">
|
<data-source name="hy_passport@localhost" uuid="74bcf3ef-a2b9-435b-b9e5-f32902a33b25">
|
||||||
<database-info product="PostgreSQL" version="16.2 (Homebrew)" jdbc-version="4.2" driver-name="PostgreSQL JDBC Driver" driver-version="42.6.0" dbms="POSTGRES" exact-version="16.2" exact-driver-version="42.6">
|
<database-info product="PostgreSQL" version="16.3 (Homebrew)" jdbc-version="4.2" driver-name="PostgreSQL JDBC Driver" driver-version="42.6.0" dbms="POSTGRES" exact-version="16.3" exact-driver-version="42.6">
|
||||||
<identifier-quote-string>"</identifier-quote-string>
|
<identifier-quote-string>"</identifier-quote-string>
|
||||||
</database-info>
|
</database-info>
|
||||||
<case-sensitivity plain-identifiers="lower" quoted-identifiers="exact" />
|
<case-sensitivity plain-identifiers="lower" quoted-identifiers="exact" />
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
4||10|C|G
|
4||10|C|G
|
||||||
4||10|T|G</Grants>
|
4||10|T|G</Grants>
|
||||||
<IntrospectionStateNumber>7430</IntrospectionStateNumber>
|
<IntrospectionStateNumber>7430</IntrospectionStateNumber>
|
||||||
<ServerVersion>16.2</ServerVersion>
|
<ServerVersion>16.3</ServerVersion>
|
||||||
<StartupTime>1716108620</StartupTime>
|
<StartupTime>1716108620</StartupTime>
|
||||||
<TimeZones>true ACDT
|
<TimeZones>true ACDT
|
||||||
true ACSST
|
true ACSST
|
||||||
|
15
.idea/workspace.xml
generated
15
.idea/workspace.xml
generated
@ -4,11 +4,16 @@
|
|||||||
<option name="autoReloadType" value="ALL" />
|
<option name="autoReloadType" value="ALL" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":card_file_box: Add the status model">
|
<list default="true" id="3fefb2c4-b6f9-466b-a523-53352e8d6f95" name="更改" comment=":bug: Authenticate wrong payload hotfix">
|
||||||
|
<change beforePath="$PROJECT_DIR$/.idea/dataSources/74bcf3ef-a2b9-435b-b9e5-f32902a33b25.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/dataSources/74bcf3ef-a2b9-435b-b9e5-f32902a33b25.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/pkg/internal/server/api/auth_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/auth_api.go" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/pkg/internal/server/api/auth_api.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/auth_api.go" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/pkg/internal/services/factors.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/services/factors.go" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/pkg/internal/server/api/index.go" beforeDir="false" afterPath="$PROJECT_DIR$/pkg/internal/server/api/index.go" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/web/src/components/auth/Authenticate.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/components/auth/Authenticate.vue" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/web/src/layouts/master.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/layouts/master.vue" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/web/src/layouts/user-center.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/layouts/user-center.vue" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/web/src/router/index.ts" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/router/index.ts" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/web/src/views/auth/sign-in.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/views/auth/sign-in.vue" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/web/src/views/personalize.vue" beforeDir="false" afterPath="$PROJECT_DIR$/web/src/views/personalize.vue" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
@ -146,7 +151,6 @@
|
|||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
<component name="VcsManagerConfiguration">
|
<component name="VcsManagerConfiguration">
|
||||||
<MESSAGE value=":bug: Fix APNs pushes no sound (again)" />
|
|
||||||
<MESSAGE value=":fire: Remove ws connected does not push notify feature" />
|
<MESSAGE value=":fire: Remove ws connected does not push notify feature" />
|
||||||
<MESSAGE value=":sparkles: Able to read current user's realm profile" />
|
<MESSAGE value=":sparkles: Able to read current user's realm profile" />
|
||||||
<MESSAGE value=":sparkles: Consul registration" />
|
<MESSAGE value=":sparkles: Consul registration" />
|
||||||
@ -171,7 +175,8 @@
|
|||||||
<MESSAGE value=":bug: Fix avatar and banner APIs" />
|
<MESSAGE value=":bug: Fix avatar and banner APIs" />
|
||||||
<MESSAGE value=":bug: Fix frontend" />
|
<MESSAGE value=":bug: Fix frontend" />
|
||||||
<MESSAGE value=":card_file_box: Add the status model" />
|
<MESSAGE value=":card_file_box: Add the status model" />
|
||||||
<option name="LAST_COMMIT_MESSAGE" value=":card_file_box: Add the status model" />
|
<MESSAGE value=":bug: Authenticate wrong payload hotfix" />
|
||||||
|
<option name="LAST_COMMIT_MESSAGE" value=":bug: Authenticate wrong payload hotfix" />
|
||||||
</component>
|
</component>
|
||||||
<component name="VgoProject">
|
<component name="VgoProject">
|
||||||
<settings-migrated>true</settings-migrated>
|
<settings-migrated>true</settings-migrated>
|
||||||
|
@ -10,6 +10,20 @@ import (
|
|||||||
"git.solsynth.dev/hydrogen/passport/pkg/internal/services"
|
"git.solsynth.dev/hydrogen/passport/pkg/internal/services"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func getTicket(c *fiber.Ctx) error {
|
||||||
|
ticketId, err := c.ParamsInt("ticketId")
|
||||||
|
if err != nil {
|
||||||
|
return fiber.NewError(fiber.StatusBadRequest, "ticket id is required")
|
||||||
|
}
|
||||||
|
|
||||||
|
ticket, err := services.GetTicket(uint(ticketId))
|
||||||
|
if err != nil {
|
||||||
|
return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("ticket %d not found", ticketId))
|
||||||
|
} else {
|
||||||
|
return c.JSON(ticket)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func doAuthenticate(c *fiber.Ctx) error {
|
func doAuthenticate(c *fiber.Ctx) error {
|
||||||
var data struct {
|
var data struct {
|
||||||
Username string `json:"username" validate:"required"`
|
Username string `json:"username" validate:"required"`
|
||||||
|
@ -59,6 +59,8 @@ func MapAPIs(app *fiber.App) {
|
|||||||
auth.Post("/mfa", doMultiFactorAuthenticate)
|
auth.Post("/mfa", doMultiFactorAuthenticate)
|
||||||
auth.Post("/token", getToken)
|
auth.Post("/token", getToken)
|
||||||
|
|
||||||
|
auth.Get("/tickets/:ticketId", getTicket)
|
||||||
|
|
||||||
auth.Get("/factors", getAvailableFactors)
|
auth.Get("/factors", getAvailableFactors)
|
||||||
auth.Post("/factors/:factorId", requestFactorToken)
|
auth.Post("/factors/:factorId", requestFactorToken)
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<AppBar />
|
<app-bar />
|
||||||
|
|
||||||
<v-main>
|
<v-main>
|
||||||
<router-view />
|
<router-view />
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<AppBar>
|
<app-bar>
|
||||||
<template #extension>
|
<template #extension>
|
||||||
<v-tabs align-tabs="title" color="white">
|
<v-tabs align-tabs="title" color="white">
|
||||||
<v-tab text="Dashboard" prepend-icon="mdi-view-dashboard" :to="{ name: 'dashboard' }" exact />
|
<v-tab text="Dashboard" prepend-icon="mdi-view-dashboard" :to="{ name: 'dashboard' }" exact />
|
||||||
@ -7,7 +7,7 @@
|
|||||||
<v-tab text="Security" prepend-icon="mdi-security" :to="{ name: 'security' }" exact />
|
<v-tab text="Security" prepend-icon="mdi-security" :to="{ name: 'security' }" exact />
|
||||||
</v-tabs>
|
</v-tabs>
|
||||||
</template>
|
</template>
|
||||||
</AppBar>
|
</app-bar>
|
||||||
|
|
||||||
<v-main>
|
<v-main>
|
||||||
<v-container class="pt-6 px-6 p-container">
|
<v-container class="pt-6 px-6 p-container">
|
||||||
|
@ -39,6 +39,7 @@ const router = createRouter({
|
|||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "/sign-in",
|
path: "/sign-in",
|
||||||
|
alias: ["/mfa"],
|
||||||
name: "auth.sign-in",
|
name: "auth.sign-in",
|
||||||
component: () => import("@/views/auth/sign-in.vue"),
|
component: () => import("@/views/auth/sign-in.vue"),
|
||||||
meta: { public: true, title: "Sign in" },
|
meta: { public: true, title: "Sign in" },
|
||||||
|
@ -25,7 +25,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { type Component, ref } from "vue"
|
import { type Component, onMounted, ref } from "vue"
|
||||||
|
import { useRoute } from "vue-router"
|
||||||
import Copyright from "@/components/Copyright.vue"
|
import Copyright from "@/components/Copyright.vue"
|
||||||
import CallbackNotify from "@/components/auth/CallbackNotify.vue"
|
import CallbackNotify from "@/components/auth/CallbackNotify.vue"
|
||||||
import FactorPicker from "@/components/auth/FactorPicker.vue"
|
import FactorPicker from "@/components/auth/FactorPicker.vue"
|
||||||
@ -33,11 +34,28 @@ import FactorApplicator from "@/components/auth/FactorApplicator.vue"
|
|||||||
import AccountAuthenticate from "@/components/auth/Authenticate.vue"
|
import AccountAuthenticate from "@/components/auth/Authenticate.vue"
|
||||||
import AuthenticateCompleted from "@/components/auth/AuthenticateCompleted.vue"
|
import AuthenticateCompleted from "@/components/auth/AuthenticateCompleted.vue"
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
|
|
||||||
const currentFactor = ref<any>(null)
|
const currentFactor = ref<any>(null)
|
||||||
const ticket = ref<any>(null)
|
const ticket = ref<any>(null)
|
||||||
|
|
||||||
|
async function pickUpTicket() {
|
||||||
|
if (route.query["ticketId"]) {
|
||||||
|
loading.value = true
|
||||||
|
const res = await fetch(`/api/auth/tickets/${route.query["ticketId"]}`)
|
||||||
|
if (res.status == 200) {
|
||||||
|
ticket.value = await res.json()
|
||||||
|
if (ticket.value["available_at"] != null) panel.value = "completed"
|
||||||
|
else panel.value = "mfa"
|
||||||
|
}
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => pickUpTicket())
|
||||||
|
|
||||||
const panel = ref("authenticate")
|
const panel = ref("authenticate")
|
||||||
|
|
||||||
const panels: { [id: string]: Component } = {
|
const panels: { [id: string]: Component } = {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<GoUseSolian class="mb-3" />
|
<go-use-solian class="mb-3" />
|
||||||
|
|
||||||
<v-card title="Information" prepend-icon="mdi-face-man-profile" :loading="loading">
|
<v-card title="Information" prepend-icon="mdi-face-man-profile" :loading="loading">
|
||||||
<template #text>
|
<template #text>
|
||||||
|
Loading…
Reference in New Issue
Block a user