Skip to content

Commit 673f556

Browse files
committed
fix: more rabbit nitpicks
1 parent 01e491c commit 673f556

6 files changed

Lines changed: 27 additions & 7 deletions

File tree

frontend/src/pages/authorize-page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
CardFooter,
1111
CardContent,
1212
} from "@/components/ui/card";
13-
import { getOidcClientInfoScehma } from "@/schemas/oidc-schemas";
13+
import { getOidcClientInfoSchema } from "@/schemas/oidc-schemas";
1414
import { Button } from "@/components/ui/button";
1515
import axios from "axios";
1616
import { toast } from "sonner";
@@ -73,13 +73,13 @@ export const AuthorizePage = () => {
7373
isOidc,
7474
compiled: compiledOIDCParams,
7575
} = useOIDCParams(searchParams);
76-
const scopes = props.scope.split(" ");
76+
const scopes = props.scope ? props.scope.split(" ").filter(Boolean) : [];
7777

7878
const getClientInfo = useQuery({
7979
queryKey: ["client", props.client_id],
8080
queryFn: async () => {
8181
const res = await fetch(`/api/oidc/clients/${props.client_id}`);
82-
const data = await getOidcClientInfoScehma.parseAsync(await res.json());
82+
const data = await getOidcClientInfoSchema.parseAsync(await res.json());
8383
return data;
8484
},
8585
enabled: isOidc,

frontend/src/pages/login-page.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@ export const LoginPage = () => {
149149
[],
150150
);
151151

152+
if (isLoggedIn && isOidc) {
153+
return <Navigate to={`/authorize?${compiledOIDCParams}`} replace />;
154+
}
155+
152156
if (isLoggedIn && props.redirect_uri !== "") {
153157
return (
154158
<Navigate
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { z } from "zod";
22

3-
export const getOidcClientInfoScehma = z.object({
3+
export const getOidcClientInfoSchema = z.object({
44
name: z.string(),
55
});

internal/controller/oidc_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ func (controller *OIDCController) Token(c *gin.Context) {
273273

274274
tokenResponse = tokenRes
275275
case "refresh_token":
276-
tokenRes, err := controller.oidc.RefreshAccessToken(c, req.RefreshToken)
276+
tokenRes, err := controller.oidc.RefreshAccessToken(c, req.RefreshToken, rclientId)
277277

278278
if err != nil {
279279
if errors.Is(err, service.ErrTokenExpired) {
@@ -284,6 +284,14 @@ func (controller *OIDCController) Token(c *gin.Context) {
284284
return
285285
}
286286

287+
if errors.Is(err, service.ErrInvalidClient) {
288+
tlog.App.Error().Err(err).Msg("Invalid client")
289+
c.JSON(401, gin.H{
290+
"error": "invalid_grant",
291+
})
292+
return
293+
}
294+
287295
tlog.App.Error().Err(err).Msg("Failed to refresh access token")
288296
c.JSON(400, gin.H{
289297
"error": "server_error",

internal/controller/oidc_controller_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ func TestOIDCController(t *testing.T) {
176176

177177
req, err = http.NewRequest("POST", "/api/oidc/token", strings.NewReader(params.Encode()))
178178

179+
assert.NilError(t, err)
180+
179181
req.Header.Set("content-type", "application/x-www-form-urlencoded")
180182
req.SetBasicAuth("some-client-id", "some-client-secret")
181183

internal/service/oidc_service.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ var (
3737
ErrCodeNotFound = errors.New("code_not_found")
3838
ErrTokenNotFound = errors.New("token_not_found")
3939
ErrTokenExpired = errors.New("token_expired")
40+
ErrInvalidClient = errors.New("invalid_client")
4041
)
4142

4243
type ClaimSet struct {
@@ -212,7 +213,7 @@ func (service *OIDCService) Init() error {
212213
}
213214

214215
func (service *OIDCService) GetIssuer() string {
215-
return service.config.Issuer
216+
return service.issuer
216217
}
217218

218219
func (service *OIDCService) GetClient(id string) (config.OIDCClientConfig, bool) {
@@ -424,7 +425,7 @@ func (service *OIDCService) GenerateAccessToken(c *gin.Context, client config.OI
424425
return tokenResponse, nil
425426
}
426427

427-
func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken string) (TokenResponse, error) {
428+
func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken string, reqClientId string) (TokenResponse, error) {
428429
entry, err := service.queries.GetOidcTokenByRefreshToken(c, service.Hash(refreshToken))
429430

430431
if err != nil {
@@ -438,6 +439,11 @@ func (service *OIDCService) RefreshAccessToken(c *gin.Context, refreshToken stri
438439
return TokenResponse{}, ErrTokenExpired
439440
}
440441

442+
// Ensure the client ID in the request matches the client ID in the token
443+
if entry.ClientID != reqClientId {
444+
return TokenResponse{}, ErrInvalidClient
445+
}
446+
441447
idToken, err := service.generateIDToken(config.OIDCClientConfig{
442448
ClientID: entry.ClientID,
443449
}, entry.Sub)

0 commit comments

Comments
 (0)