add redirection after oauth

pull/6/head
Namekuji 2022-12-06 03:57:20 -05:00
rodzic d8a5b3898f
commit 4013866615
7 zmienionych plików z 68 dodań i 19 usunięć

Wyświetl plik

@ -24,7 +24,15 @@ const vuetify = createVuetify({
},
});
axios.defaults.withCredentials = true
axios.defaults.withCredentials = true;
axios.interceptors.response.use(undefined, (error) => {
if (error.response?.status === 401) {
router.push({
name: "login"
});
}
return Promise.reject(error);
});
const app = createApp(App);

Wyświetl plik

@ -21,7 +21,6 @@ const router = createRouter({
{
path: "/login",
name: "login",
replace: true,
component: LoginView,
// component: () => import("../views/LoginView.vue"),
},

Wyświetl plik

@ -1,6 +1,20 @@
<script>
import { RouterLink } from "vue-router";
import axios from "axios";
export default {
async mounted() {
try {
await axios.get("/app/verify");
} catch {}
},
};
</script>
<template>
<div class="about">
<h1>This is an about page</h1>
<RouterLink to="login">Login</RouterLink>
</div>
</template>

Wyświetl plik

@ -1,5 +1,8 @@
<script setup>
<script>
import { RouterLink } from 'vue-router';
export default {
}
</script>
<template>

Wyświetl plik

@ -16,8 +16,13 @@ export default {
return {
server: "",
serverErr: "",
lastPath: null,
};
},
mounted() {
const from = this.$router.options.history.state.back;
this.lastPath = from === this.$route.path ? "/" : from;
},
validations() {
return {
server: {
@ -47,6 +52,7 @@ export default {
}
try {
const response = await axios.postForm("/app/login", {
redir: this.lastPath,
server: this.server,
});
if (response.status === 201) {
@ -55,20 +61,23 @@ export default {
this.serverErr = "";
}
} catch (error) {
if (error.response && error.response.status === 404) {
this.serverErr = "サーバーが見つかりません"
if (error.response?.status === 404) {
this.serverErr = "サーバーが見つかりません";
}
}
},
onInput () {
onInput() {
this.v$.server.$touch();
this.serverErr = "";
}
},
},
};
</script>
<template>
<v-alert v-if="$route.query.warn" type="warning" variant="text">
<div>ログインが必要です</div>
</v-alert>
<h1>Audon</h1>
<v-form ref="form" @submit.prevent="onSubmit" class="my-3" lazy-validation>
<v-text-field

Wyświetl plik

@ -33,23 +33,31 @@ func verifyTokenInSession(c echo.Context) (bool, *mastodon.Account, error) {
return true, acc, nil
}
type LoginRequest struct {
ServerHost string `validate:"required,hostname,fqdn" form:"server"`
Redirect string `validate:"url_encoded" form:"redir"`
}
// handler for POST to /app/login
func loginHandler(c echo.Context) (err error) {
serverHost := c.FormValue("server")
req := new(LoginRequest)
if err = mainValidator.Var(serverHost, "required,hostname,fqdn"); err != nil {
if err = c.Bind(req); err != nil {
return ErrInvalidRequestFormat
}
if err = mainValidator.Struct(req); err != nil {
return wrapValidationError(err)
}
valid, _, _ := verifyTokenInSession(c)
if !valid {
serverURL := &url.URL{
Host: serverHost,
Host: req.ServerHost,
Scheme: "https",
Path: "/",
}
appConfig, err := getAppConfig(serverURL.String())
appConfig, err := getAppConfig(serverURL.String(), req.Redirect)
if err != nil {
return ErrInvalidRequestFormat
}
@ -79,18 +87,23 @@ func loginHandler(c echo.Context) (err error) {
// handler for GET to /app/oauth?code=****
func oauthHandler(c echo.Context) (err error) {
authCode := c.QueryParam("code")
redir := c.QueryParam("redir")
if authCode == "" {
if errMsg := c.QueryParam("error"); errMsg == "access_denied" {
return c.Redirect(http.StatusFound, "/login")
}
return echo.NewHTTPError(http.StatusBadRequest, "auth_code_required")
}
if redir == "" {
redir = "/"
}
data, err := getSessionData(c)
if err != nil {
return err
}
appConf, err := getAppConfig(data.MastodonConfig.Server)
appConf, err := getAppConfig(data.MastodonConfig.Server, "/")
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
@ -141,18 +154,18 @@ func oauthHandler(c echo.Context) (err error) {
return echo.NewHTTPError(http.StatusInternalServerError)
}
return c.Redirect(http.StatusFound, "/")
return c.Redirect(http.StatusFound, redir)
// return c.Redirect(http.StatusFound, "http://localhost:5173")
}
func getOAuthTokenHandler(c echo.Context) (err error) {
return nil
}
func authMiddleware(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
data, err := getSessionData(c)
if err != nil {
return err
}
if data.AudonID != "" {
if err == nil && data.AudonID != "" {
if user, err := findUserByID(c.Request().Context(), data.AudonID); err == nil {
c.Set("user", user)
c.Set("session", data)

Wyświetl plik

@ -148,7 +148,7 @@ func (cv *CustomValidator) Validate(i interface{}) error {
return nil
}
func getAppConfig(server string) (*mastodon.AppConfig, error) {
func getAppConfig(server string, redirPath string) (*mastodon.AppConfig, error) {
if mastAppConfigBase != nil {
return &mastodon.AppConfig{
Server: server,
@ -165,6 +165,9 @@ func getAppConfig(server string) (*mastodon.AppConfig, error) {
Scheme: "https",
Path: "/",
}
q := u.Query()
q.Add("redir", redirPath)
u.RawQuery = q.Encode()
u = u.JoinPath("app", "oauth")
redirectURI = u.String()