kopia lustrzana https://codeberg.org/nmkj/audon
add redirection after oauth
rodzic
d8a5b3898f
commit
4013866615
|
@ -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);
|
||||
|
||||
|
|
|
@ -21,7 +21,6 @@ const router = createRouter({
|
|||
{
|
||||
path: "/login",
|
||||
name: "login",
|
||||
replace: true,
|
||||
component: LoginView,
|
||||
// component: () => import("../views/LoginView.vue"),
|
||||
},
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
<script setup>
|
||||
<script>
|
||||
import { RouterLink } from 'vue-router';
|
||||
|
||||
export default {
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
|
|
@ -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
|
||||
|
|
35
oauth.go
35
oauth.go
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue