autherr 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export declare function createClientAssertion(clientId: string, privateKeyPem: string): Promise<string>;
@@ -0,0 +1,17 @@
1
+ // src/crypto/createClientAssertion.ts
2
+ import { SignJWT } from "jose";
3
+ import { pemToArrayBuffer } from "./pemUtils";
4
+ export async function createClientAssertion(clientId, privateKeyPem) {
5
+ const key = await crypto.subtle.importKey("pkcs8", pemToArrayBuffer(privateKeyPem), {
6
+ name: "RSASSA-PKCS1-v1_5",
7
+ hash: "SHA-256",
8
+ }, false, ["sign"]);
9
+ const now = Math.floor(Date.now() / 1000);
10
+ return await new SignJWT({ clientId })
11
+ .setProtectedHeader({ alg: "RS256", typ: "JWT" })
12
+ .setIssuedAt(now)
13
+ .setExpirationTime(now + 120) // ⏱ 2 minutes
14
+ .setAudience("autherr")
15
+ .setIssuer(clientId)
16
+ .sign(key);
17
+ }
@@ -0,0 +1 @@
1
+ export declare function pemToArrayBuffer(pem: string): ArrayBuffer;
@@ -0,0 +1,13 @@
1
+ // src/crypto/pemUtils.ts
2
+ export function pemToArrayBuffer(pem) {
3
+ const b64 = pem
4
+ .replace(/-----BEGIN [^-]+-----/, "")
5
+ .replace(/-----END [^-]+-----/, "")
6
+ .replace(/\s+/g, "");
7
+ const binary = atob(b64);
8
+ const bytes = new Uint8Array(binary.length);
9
+ for (let i = 0; i < binary.length; i++) {
10
+ bytes[i] = binary.charCodeAt(i);
11
+ }
12
+ return bytes.buffer;
13
+ }
@@ -12,7 +12,8 @@ interface AutherrProviderProps {
12
12
  children: React.ReactNode;
13
13
  clientId: string;
14
14
  baseUrl: string;
15
+ clientPrivateKey: string;
15
16
  }
16
- export declare function AutherrProvider({ children, clientId, baseUrl, }: AutherrProviderProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function AutherrProvider({ children, clientId, baseUrl, clientPrivateKey, }: AutherrProviderProps): import("react/jsx-runtime").JSX.Element;
17
18
  export declare function useAutherrContext(): AutherrContextValue;
18
19
  export {};
@@ -2,8 +2,16 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createContext, useContext, useEffect, useMemo, useState, } from "react";
3
3
  import { fetchSession } from "../api/session";
4
4
  import { logoutSession } from "../api/logout";
5
+ import { createClientAssertion } from "../crypto/createClientAssertion";
6
+ function setClientAssertionCookie(token) {
7
+ document.cookie =
8
+ `autherr_client_assertion=${token};` +
9
+ `Path=/;` +
10
+ `Secure;` +
11
+ `SameSite=None`;
12
+ }
5
13
  const AutherrContext = createContext(null);
6
- export function AutherrProvider({ children, clientId, baseUrl, }) {
14
+ export function AutherrProvider({ children, clientId, baseUrl, clientPrivateKey, }) {
7
15
  const [accessToken, setAccessToken] = useState(null);
8
16
  const [isAuthenticated, setIsAuthenticated] = useState(false);
9
17
  const refreshSession = async () => {
@@ -20,16 +28,20 @@ export function AutherrProvider({ children, clientId, baseUrl, }) {
20
28
  useEffect(() => {
21
29
  refreshSession();
22
30
  }, [baseUrl, clientId]);
23
- const login = () => {
31
+ const login = async () => {
24
32
  const state = crypto.randomUUID();
33
+ const assertion = await createClientAssertion(clientId, clientPrivateKey);
34
+ setClientAssertionCookie(assertion);
25
35
  window.location.href =
26
36
  `${baseUrl}/auth/login` +
27
37
  `?client_id=${clientId}` +
28
38
  `&redirect_uri=${encodeURIComponent(window.location.origin)}` +
29
39
  `&state=${state}`;
30
40
  };
31
- const signup = () => {
41
+ const signup = async () => {
32
42
  const state = crypto.randomUUID();
43
+ const assertion = await createClientAssertion(clientId, clientPrivateKey);
44
+ setClientAssertionCookie(assertion);
33
45
  window.location.href =
34
46
  `${baseUrl}/auth/signup` +
35
47
  `?client_id=${clientId}` +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autherr",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "dest": "dist",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {