Compare commits

..

7 Commits

Author SHA1 Message Date
Stavros
7ee0b645e6 chore: bump version 2025-02-19 17:41:23 +02:00
Stavros
5c34ab96a9 fix: redirect user correctly 2025-02-19 17:05:01 +02:00
Stavros
cb6f93d879 chore: update readme 2025-02-17 07:49:01 +02:00
Stavros
df0c356511 chore: update example and dev compose files 2025-02-16 22:59:04 +02:00
Stavros
d1c6ae1ba1 fix: redirect to frontend when no redirect uri is present in oauth callback 2025-02-16 22:48:04 +02:00
Stavros
0f8d2e7fde fix: make query check account for spaces 2025-02-16 21:14:21 +02:00
Stavros
0da82ae3fe chore: update readme 2025-02-15 19:53:21 +02:00
9 changed files with 15 additions and 14 deletions

View File

@@ -24,7 +24,7 @@ Tinyauth is a simple authentication middleware that adds simple username/passwor
## Discord ## Discord
I just made a Discord server for Tinyauth! It is not only for Tinyauth but general self-hosting because I just like chatting with people! The link is [here](https://discord.gg/gWpzrksk), see you there! I just made a Discord server for Tinyauth! It is not only for Tinyauth but general self-hosting because I just like chatting with people! The link is [here](https://discord.gg/eHzVaCzRRd), see you there!
## Getting Started ## Getting Started
@@ -46,5 +46,5 @@ Tinyauth is licensed under the GNU General Public License v3.0. TL;DR — You ma
Credits for the logo of this app go to: Credits for the logo of this app go to:
- **Freepik** for providing the police hat and logo. - **Freepik** for providing the police hat and badge.
- **Renee French** for the original gopher logo. - **Renee French** for the original gopher logo.

View File

@@ -30,4 +30,4 @@ services:
traefik.enable: true traefik.enable: true
traefik.http.routers.tinyauth.rule: Host(`tinyauth.dev.local`) traefik.http.routers.tinyauth.rule: Host(`tinyauth.dev.local`)
traefik.http.services.tinyauth.loadbalancer.server.port: 3000 traefik.http.services.tinyauth.loadbalancer.server.port: 3000
traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth/traefik

View File

@@ -28,4 +28,4 @@ services:
traefik.enable: true traefik.enable: true
traefik.http.routers.tinyauth.rule: Host(`tinyauth.example.com`) traefik.http.routers.tinyauth.rule: Host(`tinyauth.example.com`)
traefik.http.services.tinyauth.loadbalancer.server.port: 3000 traefik.http.services.tinyauth.loadbalancer.server.port: 3000
traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth traefik.http.middlewares.tinyauth.forwardauth.address: http://tinyauth:3000/api/auth/traefik

View File

@@ -533,10 +533,7 @@ func (api *API) SetupRoutes() {
// If it is empty it means that no redirect_uri was provided to the login screen so we just log in // If it is empty it means that no redirect_uri was provided to the login screen so we just log in
if redirectURIErr != nil { if redirectURIErr != nil {
c.JSON(200, gin.H{ c.Redirect(http.StatusPermanentRedirect, api.Config.AppURL)
"status": 200,
"message": "Logged in",
})
} }
log.Debug().Str("redirectURI", redirectURI).Msg("Got redirect URI") log.Debug().Str("redirectURI", redirectURI).Msg("Got redirect URI")

View File

@@ -1 +1 @@
v3.0.0 v3.0.1

View File

@@ -4,6 +4,7 @@ import { Navigate } from "react-router";
import { useUserContext } from "../context/user-context"; import { useUserContext } from "../context/user-context";
import { Layout } from "../components/layouts/layout"; import { Layout } from "../components/layouts/layout";
import { ReactNode } from "react"; import { ReactNode } from "react";
import { isQueryValid } from "../utils/utils";
export const ContinuePage = () => { export const ContinuePage = () => {
const queryString = window.location.search; const queryString = window.location.search;
@@ -16,7 +17,7 @@ export const ContinuePage = () => {
return <Navigate to={`/login?redirect_uri=${redirectUri}`} />; return <Navigate to={`/login?redirect_uri=${redirectUri}`} />;
} }
if (redirectUri === "null" || redirectUri === "") { if (!isQueryValid(redirectUri)) {
return <Navigate to="/" />; return <Navigate to="/" />;
} }

View File

@@ -20,6 +20,7 @@ import { GoogleIcon } from "../icons/google";
import { GithubIcon } from "../icons/github"; import { GithubIcon } from "../icons/github";
import { OAuthIcon } from "../icons/oauth"; import { OAuthIcon } from "../icons/oauth";
import { TailscaleIcon } from "../icons/tailscale"; import { TailscaleIcon } from "../icons/tailscale";
import { isQueryValid } from "../utils/utils";
export const LoginPage = () => { export const LoginPage = () => {
const queryString = window.location.search; const queryString = window.location.search;
@@ -70,7 +71,7 @@ export const LoginPage = () => {
color: "green", color: "green",
}); });
setTimeout(() => { setTimeout(() => {
if (redirectUri === "null" || redirectUri === "") { if (!isQueryValid(redirectUri)) {
window.location.replace("/"); window.location.replace("/");
} else { } else {
window.location.replace(`/continue?redirect_uri=${redirectUri}`); window.location.replace(`/continue?redirect_uri=${redirectUri}`);

View File

@@ -1,6 +1,7 @@
import { Button, Code, Paper, Text } from "@mantine/core"; import { Button, Code, Paper, Text } from "@mantine/core";
import { Layout } from "../components/layouts/layout"; import { Layout } from "../components/layouts/layout";
import { Navigate } from "react-router"; import { Navigate } from "react-router";
import { isQueryValid } from "../utils/utils";
export const UnauthorizedPage = () => { export const UnauthorizedPage = () => {
const queryString = window.location.search; const queryString = window.location.search;
@@ -8,7 +9,7 @@ export const UnauthorizedPage = () => {
const username = params.get("username") ?? ""; const username = params.get("username") ?? "";
const resource = params.get("resource") ?? ""; const resource = params.get("resource") ?? "";
if (username === "null" || username === "") { if (!isQueryValid(username)) {
return <Navigate to="/" />; return <Navigate to="/" />;
} }
@@ -20,7 +21,7 @@ export const UnauthorizedPage = () => {
</Text> </Text>
<Text> <Text>
The user with username <Code>{username}</Code> is not authorized to{" "} The user with username <Code>{username}</Code> is not authorized to{" "}
{resource !== "null" && resource !== "" ? ( {isQueryValid(resource) ? (
<span> <span>
access the <Code>{resource}</Code> resource. access the <Code>{resource}</Code> resource.
</span> </span>

View File

@@ -1 +1,2 @@
export const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1); export const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1);
export const isQueryValid = (value: string) => value.trim() !== "" && value !== "null";