@atproto/oauth-provider 0.2.6 → 0.2.8
Sign up to get free protection for your applications and to get access to all the features.
- package/CHANGELOG.md +13 -0
- package/dist/assets/app/bundle-manifest.json +2 -2
- package/dist/assets/app/main.js +3 -3
- package/dist/assets/app/main.js.map +1 -1
- package/dist/assets/assets-middleware.js +1 -1
- package/dist/assets/assets-middleware.js.map +1 -1
- package/dist/client/client.d.ts +2 -2
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js.map +1 -1
- package/dist/lib/http/accept.d.ts +1 -0
- package/dist/lib/http/accept.d.ts.map +1 -1
- package/dist/lib/http/accept.js +1 -0
- package/dist/lib/http/accept.js.map +1 -1
- package/dist/lib/http/middleware.js +1 -1
- package/dist/lib/http/middleware.js.map +1 -1
- package/dist/lib/http/response.d.ts +9 -5
- package/dist/lib/http/response.d.ts.map +1 -1
- package/dist/lib/http/response.js +18 -59
- package/dist/lib/http/response.js.map +1 -1
- package/dist/oauth-provider.d.ts.map +1 -1
- package/dist/oauth-provider.js +19 -9
- package/dist/oauth-provider.js.map +1 -1
- package/dist/oauth-verifier.d.ts +2 -2
- package/dist/oauth-verifier.d.ts.map +1 -1
- package/dist/oauth-verifier.js.map +1 -1
- package/dist/output/send-web-page.d.ts +3 -3
- package/dist/output/send-web-page.d.ts.map +1 -1
- package/dist/output/send-web-page.js +2 -2
- package/dist/output/send-web-page.js.map +1 -1
- package/dist/request/request-uri.d.ts.map +1 -1
- package/dist/request/request-uri.js +0 -1
- package/dist/request/request-uri.js.map +1 -1
- package/dist/signer/signed-token-payload.d.ts +3 -3
- package/dist/signer/signer.d.ts +1 -1
- package/dist/token/token-claims.d.ts +3 -3
- package/package.json +2 -2
- package/src/assets/assets-middleware.ts +1 -1
- package/src/client/client.ts +2 -1
- package/src/lib/http/accept.ts +1 -0
- package/src/lib/http/middleware.ts +1 -1
- package/src/lib/http/response.ts +37 -78
- package/src/oauth-provider.ts +18 -10
- package/src/oauth-verifier.ts +2 -1
- package/src/output/send-web-page.ts +5 -3
- package/src/request/request-uri.ts +0 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"oauth-verifier.js","sourceRoot":"","sources":["../src/oauth-verifier.ts"],"names":[],"mappings":";;;AAAA,sCAAuD;
|
1
|
+
{"version":3,"file":"oauth-verifier.js","sourceRoot":"","sources":["../src/oauth-verifier.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { ServerResponse } from 'node:http';
|
2
2
|
import { BuildDocumentOptions, Html } from '../lib/html/index.js';
|
3
|
+
import { WriteResponseOptions } from '../lib/http/response.js';
|
3
4
|
export declare function declareBackendData(name: string, data: unknown): Html;
|
4
|
-
export
|
5
|
-
|
6
|
-
}): Promise<void>;
|
5
|
+
export type SendWebPageOptions = BuildDocumentOptions & WriteResponseOptions;
|
6
|
+
export declare function sendWebPage(res: ServerResponse, options: SendWebPageOptions): Promise<void>;
|
7
7
|
//# sourceMappingURL=send-web-page.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-web-page.d.ts","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,OAAO,EAGL,oBAAoB,EACpB,IAAI,EAEL,MAAM,sBAAsB,CAAA;
|
1
|
+
{"version":3,"file":"send-web-page.d.ts","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,OAAO,EAGL,oBAAoB,EACpB,IAAI,EAEL,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAa,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEzE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,QAM7D;AAED,MAAM,MAAM,kBAAkB,GAAG,oBAAoB,GAAG,oBAAoB,CAAA;AAE5E,wBAAsB,WAAW,CAC/B,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAiCf"}
|
@@ -12,7 +12,7 @@ function declareBackendData(name, data) {
|
|
12
12
|
// "readBackendData" in "src/assets/app/backend-data.ts".
|
13
13
|
return (0, index_js_1.js) `window[${name}]=${data};document.currentScript.remove();`;
|
14
14
|
}
|
15
|
-
async function sendWebPage(res,
|
15
|
+
async function sendWebPage(res, options) {
|
16
16
|
// @TODO: make these headers configurable (?)
|
17
17
|
res.setHeader('Permissions-Policy', 'otp-credentials=*, document-domain=()');
|
18
18
|
res.setHeader('Cross-Origin-Embedder-Policy', 'credentialless');
|
@@ -35,7 +35,7 @@ async function sendWebPage(res, { status = 200, ...options }) {
|
|
35
35
|
`upgrade-insecure-requests`,
|
36
36
|
].join('; '));
|
37
37
|
const html = (0, index_js_1.buildDocument)(options);
|
38
|
-
return (0, response_js_1.writeHtml)(res, html.toString(),
|
38
|
+
return (0, response_js_1.writeHtml)(res, html.toString(), options);
|
39
39
|
}
|
40
40
|
function assetToHash(asset) {
|
41
41
|
return asset instanceof index_js_1.Html
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"send-web-page.js","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":";;AAYA,gDAMC;
|
1
|
+
{"version":3,"file":"send-web-page.js","sourceRoot":"","sources":["../../src/output/send-web-page.ts"],"names":[],"mappings":";;AAYA,gDAMC;AAID,kCAoCC;AA1DD,6CAAwC;AAGxC,mDAM6B;AAC7B,yDAAyE;AAEzE,SAAgB,kBAAkB,CAAC,IAAY,EAAE,IAAa;IAC5D,8EAA8E;IAC9E,8EAA8E;IAC9E,8DAA8D;IAC9D,yDAAyD;IACzD,OAAO,IAAA,aAAE,EAAA,UAAU,IAAI,KAAK,IAAI,mCAAmC,CAAA;AACrE,CAAC;AAIM,KAAK,UAAU,WAAW,CAC/B,GAAmB,EACnB,OAA2B;IAE3B,6CAA6C;IAC7C,GAAG,CAAC,SAAS,CAAC,oBAAoB,EAAE,uCAAuC,CAAC,CAAA;IAC5E,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,gBAAgB,CAAC,CAAA;IAC/D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAA;IAC5D,GAAG,CAAC,SAAS,CAAC,4BAA4B,EAAE,aAAa,CAAC,CAAA;IAC1D,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAA;IAC/C,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAA;IACxC,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;IAClD,GAAG,CAAC,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAA;IACtC,GAAG,CAAC,SAAS,CAAC,2BAA2B,EAAE,kBAAkB,CAAC,CAAA;IAC9D,GAAG,CAAC,SAAS,CACX,yBAAyB,EACzB;QACE,oBAAoB;QACpB,wBAAwB;QACxB,oBAAoB;QACpB,YAAY,OAAO,CAAC,IAAI,EAAE,MAAM,IAAI,QAAQ,EAAE;QAC9C,qBACE,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EACpE,EAAE;QACF,oBACE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EACnE,EAAE;QACF,6BAA6B;QAC7B,oBAAoB;QACpB,2BAA2B;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAA;IAED,MAAM,IAAI,GAAG,IAAA,wBAAa,EAAC,OAAO,CAAC,CAAA;IAEnC,OAAO,IAAA,uBAAS,EAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAA;AACjD,CAAC;AAED,SAAS,WAAW,CAAC,KAAsB;IACzC,OAAO,KAAK,YAAY,eAAI;QAC1B,CAAC,CAAC,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAChE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAA;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,WAAW,IAAI,GAAG,CAAA;AAC3B,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"request-uri.d.ts","sourceRoot":"","sources":["../../src/request/request-uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAmB,MAAM,iBAAiB,CAAA;AAE5D,eAAO,MAAM,kBAAkB,uCAAuC,CAAA;AAEtE,eAAO,MAAM,gBAAgB,
|
1
|
+
{"version":3,"file":"request-uri.d.ts","sourceRoot":"","sources":["../../src/request/request-uri.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAmB,MAAM,iBAAiB,CAAA;AAE5D,eAAO,MAAM,kBAAkB,uCAAuC,CAAA;AAEtE,eAAO,MAAM,gBAAgB,sFAU1B,CAAA;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAEzD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAEjE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,SAAS,CAGlE"}
|
@@ -8,7 +8,6 @@ const request_id_js_1 = require("./request-id.js");
|
|
8
8
|
exports.REQUEST_URI_PREFIX = 'urn:ietf:params:oauth:request_uri:';
|
9
9
|
exports.requestUriSchema = zod_1.z
|
10
10
|
.string()
|
11
|
-
.url()
|
12
11
|
.refinement((data) => data.startsWith(exports.REQUEST_URI_PREFIX) &&
|
13
12
|
request_id_js_1.requestIdSchema.safeParse(decodeRequestUri(data)).success, {
|
14
13
|
code: zod_1.z.ZodIssueCode.custom,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"request-uri.js","sourceRoot":"","sources":["../../src/request/request-uri.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"request-uri.js","sourceRoot":"","sources":["../../src/request/request-uri.ts"],"names":[],"mappings":";;;AAoBA,4CAEC;AAED,4CAGC;AA3BD,6BAAuB;AAEvB,mDAA4D;AAE/C,QAAA,kBAAkB,GAAG,oCAAoC,CAAA;AAEzD,QAAA,gBAAgB,GAAG,OAAC;KAC9B,MAAM,EAAE;KACR,UAAU,CACT,CAAC,IAAI,EAAsD,EAAE,CAC3D,IAAI,CAAC,UAAU,CAAC,0BAAkB,CAAC;IACnC,+BAAe,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAW,CAAC,CAAC,CAAC,OAAO,EAClE;IACE,IAAI,EAAE,OAAC,CAAC,YAAY,CAAC,MAAM;IAC3B,OAAO,EAAE,4BAA4B;CACtC,CACF,CAAA;AAIH,SAAgB,gBAAgB,CAAC,SAAoB;IACnD,OAAO,GAAG,0BAAkB,GAAG,kBAAkB,CAAC,SAAS,CAAc,EAAE,CAAA;AAC7E,CAAC;AAED,SAAgB,gBAAgB,CAAC,UAAsB;IACrD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,0BAAkB,CAAC,MAAM,CAAC,CAAA;IAChE,OAAO,kBAAkB,CAAC,YAAY,CAAc,CAAA;AACtD,CAAC"}
|
@@ -42,6 +42,7 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
42
42
|
identifier: z.ZodOptional<z.ZodString>;
|
43
43
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
44
44
|
}, z.ZodTypeAny, "passthrough">>, "many">>>;
|
45
|
+
email: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
45
46
|
auth_time: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
46
47
|
acr: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
47
48
|
name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
@@ -58,7 +59,6 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
58
59
|
zoneinfo: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
59
60
|
locale: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
60
61
|
updated_at: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
61
|
-
email: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
62
62
|
email_verified: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
|
63
63
|
phone_number: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
64
64
|
phone_number_verified: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
|
@@ -1393,6 +1393,7 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
1393
1393
|
identifier: z.ZodOptional<z.ZodString>;
|
1394
1394
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
1395
1395
|
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
1396
|
+
email?: string | undefined;
|
1396
1397
|
auth_time?: number | undefined;
|
1397
1398
|
acr?: string | undefined;
|
1398
1399
|
name?: string | undefined;
|
@@ -1409,7 +1410,6 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
1409
1410
|
zoneinfo?: string | undefined;
|
1410
1411
|
locale?: string | undefined;
|
1411
1412
|
updated_at?: number | undefined;
|
1412
|
-
email?: string | undefined;
|
1413
1413
|
email_verified?: boolean | undefined;
|
1414
1414
|
phone_number?: string | undefined;
|
1415
1415
|
phone_number_verified?: boolean | undefined;
|
@@ -1548,6 +1548,7 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
1548
1548
|
identifier: z.ZodOptional<z.ZodString>;
|
1549
1549
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
1550
1550
|
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
1551
|
+
email?: string | undefined;
|
1551
1552
|
auth_time?: number | undefined;
|
1552
1553
|
acr?: string | undefined;
|
1553
1554
|
name?: string | undefined;
|
@@ -1564,7 +1565,6 @@ export declare const signedTokenPayloadSchema: z.ZodIntersection<z.ZodObject<{
|
|
1564
1565
|
zoneinfo?: string | undefined;
|
1565
1566
|
locale?: string | undefined;
|
1566
1567
|
updated_at?: number | undefined;
|
1567
|
-
email?: string | undefined;
|
1568
1568
|
email_verified?: boolean | undefined;
|
1569
1569
|
phone_number?: string | undefined;
|
1570
1570
|
phone_number_verified?: boolean | undefined;
|
package/dist/signer/signer.d.ts
CHANGED
@@ -39,6 +39,7 @@ export declare class Signer {
|
|
39
39
|
identifier: import("zod").ZodOptional<import("zod").ZodString>;
|
40
40
|
privileges: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
41
41
|
}, import("zod").ZodTypeAny, "passthrough">[] | undefined;
|
42
|
+
email?: string | undefined;
|
42
43
|
auth_time?: number | undefined;
|
43
44
|
acr?: string | undefined;
|
44
45
|
name?: string | undefined;
|
@@ -55,7 +56,6 @@ export declare class Signer {
|
|
55
56
|
zoneinfo?: string | undefined;
|
56
57
|
locale?: string | undefined;
|
57
58
|
updated_at?: number | undefined;
|
58
|
-
email?: string | undefined;
|
59
59
|
email_verified?: boolean | undefined;
|
60
60
|
phone_number?: string | undefined;
|
61
61
|
phone_number_verified?: boolean | undefined;
|
@@ -38,6 +38,7 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
38
38
|
identifier: z.ZodOptional<z.ZodString>;
|
39
39
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
40
40
|
}, z.ZodTypeAny, "passthrough">>, "many">>>;
|
41
|
+
email: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
41
42
|
auth_time: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
42
43
|
acr: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
43
44
|
name: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
@@ -54,7 +55,6 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
54
55
|
zoneinfo: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
55
56
|
locale: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
56
57
|
updated_at: z.ZodOptional<z.ZodOptional<z.ZodNumber>>;
|
57
|
-
email: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
58
58
|
email_verified: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
|
59
59
|
phone_number: z.ZodOptional<z.ZodOptional<z.ZodString>>;
|
60
60
|
phone_number_verified: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
|
@@ -1387,6 +1387,7 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
1387
1387
|
identifier: z.ZodOptional<z.ZodString>;
|
1388
1388
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
1389
1389
|
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
1390
|
+
email?: string | undefined;
|
1390
1391
|
auth_time?: number | undefined;
|
1391
1392
|
acr?: string | undefined;
|
1392
1393
|
name?: string | undefined;
|
@@ -1403,7 +1404,6 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
1403
1404
|
zoneinfo?: string | undefined;
|
1404
1405
|
locale?: string | undefined;
|
1405
1406
|
updated_at?: number | undefined;
|
1406
|
-
email?: string | undefined;
|
1407
1407
|
email_verified?: boolean | undefined;
|
1408
1408
|
phone_number?: string | undefined;
|
1409
1409
|
phone_number_verified?: boolean | undefined;
|
@@ -1541,6 +1541,7 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
1541
1541
|
identifier: z.ZodOptional<z.ZodString>;
|
1542
1542
|
privileges: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
1543
1543
|
}, z.ZodTypeAny, "passthrough">[] | undefined;
|
1544
|
+
email?: string | undefined;
|
1544
1545
|
auth_time?: number | undefined;
|
1545
1546
|
acr?: string | undefined;
|
1546
1547
|
name?: string | undefined;
|
@@ -1557,7 +1558,6 @@ export declare const tokenClaimsSchema: z.ZodIntersection<z.ZodObject<{
|
|
1557
1558
|
zoneinfo?: string | undefined;
|
1558
1559
|
locale?: string | undefined;
|
1559
1560
|
updated_at?: number | undefined;
|
1560
|
-
email?: string | undefined;
|
1561
1561
|
email_verified?: boolean | undefined;
|
1562
1562
|
phone_number?: string | undefined;
|
1563
1563
|
phone_number_verified?: boolean | undefined;
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@atproto/oauth-provider",
|
3
|
-
"version": "0.2.
|
3
|
+
"version": "0.2.8",
|
4
4
|
"license": "MIT",
|
5
5
|
"description": "Generic OAuth2 and OpenID Connect provider for Node.js. Currently only supports features needed for Atproto.",
|
6
6
|
"keywords": [
|
@@ -46,7 +46,7 @@
|
|
46
46
|
"@atproto/common": "^0.4.4",
|
47
47
|
"@atproto/jwk": "0.1.1",
|
48
48
|
"@atproto/jwk-jose": "0.1.2",
|
49
|
-
"@atproto/oauth-types": "0.2.
|
49
|
+
"@atproto/oauth-types": "0.2.1"
|
50
50
|
},
|
51
51
|
"devDependencies": {
|
52
52
|
"@rollup/plugin-commonjs": "^25.0.7",
|
@@ -41,6 +41,6 @@ export function authorizeAssetsMiddleware(): Middleware {
|
|
41
41
|
res.setHeader('Cache-Control', 'public, max-age=31536000, immutable')
|
42
42
|
}
|
43
43
|
|
44
|
-
|
44
|
+
writeStream(res, asset.createStream(), { contentType: asset.type })
|
45
45
|
}
|
46
46
|
}
|
package/src/client/client.ts
CHANGED
@@ -4,6 +4,7 @@ import {
|
|
4
4
|
OAuthAuthorizationRequestParameters,
|
5
5
|
OAuthClientCredentials,
|
6
6
|
OAuthClientMetadata,
|
7
|
+
OAuthRedirectUri,
|
7
8
|
} from '@atproto/oauth-types'
|
8
9
|
import {
|
9
10
|
UnsecuredJWT,
|
@@ -323,7 +324,7 @@ export class Client {
|
|
323
324
|
return parameters
|
324
325
|
}
|
325
326
|
|
326
|
-
get defaultRedirectUri():
|
327
|
+
get defaultRedirectUri(): OAuthRedirectUri | undefined {
|
327
328
|
const { redirect_uris } = this.metadata
|
328
329
|
return redirect_uris.length === 1 ? redirect_uris[0] : undefined
|
329
330
|
}
|
package/src/lib/http/accept.ts
CHANGED
package/src/lib/http/response.ts
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
import {
|
2
|
-
import { pipeline } from 'node:stream/promises'
|
3
|
-
import { constants, createBrotliCompress, createGzip } from 'node:zlib'
|
1
|
+
import { Readable, pipeline } from 'node:stream'
|
4
2
|
|
5
3
|
import { Handler, ServerResponse } from './types.js'
|
6
4
|
|
@@ -26,108 +24,69 @@ export function writeRedirect(
|
|
26
24
|
res.writeHead(status, { Location: url }).end()
|
27
25
|
}
|
28
26
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
return 'identity'
|
27
|
+
export type WriteResponseOptions = {
|
28
|
+
status?: number
|
29
|
+
contentType?: string
|
33
30
|
}
|
34
31
|
|
35
|
-
function
|
36
|
-
switch (encoding) {
|
37
|
-
case 'br':
|
38
|
-
return createBrotliCompress({
|
39
|
-
// Default quality is too slow
|
40
|
-
params: { [constants.BROTLI_PARAM_QUALITY]: 5 },
|
41
|
-
})
|
42
|
-
case 'gzip':
|
43
|
-
return createGzip()
|
44
|
-
case 'identity':
|
45
|
-
return new PassThrough()
|
46
|
-
default:
|
47
|
-
throw new Error(`Unsupported encoding: ${encoding}`)
|
48
|
-
}
|
49
|
-
}
|
50
|
-
|
51
|
-
const ifString = (value: unknown): string | undefined =>
|
52
|
-
typeof value === 'string' ? value : undefined
|
53
|
-
|
54
|
-
export async function writeStream(
|
32
|
+
export function writeStream(
|
55
33
|
res: ServerResponse,
|
56
34
|
stream: Readable,
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
35
|
+
{
|
36
|
+
status = 200,
|
37
|
+
contentType = 'application/octet-stream',
|
38
|
+
}: WriteResponseOptions = {},
|
39
|
+
): void {
|
61
40
|
res.statusCode = status
|
62
41
|
res.setHeader('content-type', contentType)
|
63
|
-
appendHeader(res, 'vary', 'accept-encoding')
|
64
|
-
|
65
|
-
const encoding = negotiateEncoding(res.req.headers['accept-encoding'])
|
66
|
-
|
67
|
-
res.setHeader('content-encoding', encoding)
|
68
|
-
res.setHeader('transfer-encoding', 'chunked')
|
69
42
|
|
70
43
|
if (res.req.method === 'HEAD') {
|
71
44
|
res.end()
|
72
45
|
stream.destroy()
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
await pipeline(stream, getEncoder(encoding), res)
|
78
|
-
} catch (err) {
|
79
|
-
// Prevent the socket from being left open in a bad state
|
80
|
-
res.socket?.destroy()
|
81
|
-
|
82
|
-
if (err != null && typeof err === 'object') {
|
83
|
-
// If an abort signal is used, we can consider this function's job successful
|
84
|
-
if ('name' in err && err.name === 'AbortError') return
|
85
|
-
|
86
|
-
// If the client closes the connection, we don't care about the error
|
87
|
-
if ('code' in err && err.code === 'ERR_STREAM_PREMATURE_CLOSE') return
|
88
|
-
}
|
89
|
-
|
90
|
-
throw err
|
46
|
+
} else {
|
47
|
+
pipeline([stream, res], (_err: Error | null) => {
|
48
|
+
// The error will be propagated through the streams
|
49
|
+
})
|
91
50
|
}
|
92
51
|
}
|
93
52
|
|
94
|
-
export
|
53
|
+
export function writeBuffer(
|
95
54
|
res: ServerResponse,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
55
|
+
chunk: string | Buffer,
|
56
|
+
{
|
57
|
+
status = 200,
|
58
|
+
contentType = 'application/octet-stream',
|
59
|
+
}: WriteResponseOptions = {},
|
60
|
+
): void {
|
61
|
+
res.statusCode = status
|
62
|
+
res.setHeader('content-type', contentType)
|
63
|
+
res.end(chunk)
|
102
64
|
}
|
103
65
|
|
104
|
-
export
|
66
|
+
export function writeJson(
|
105
67
|
res: ServerResponse,
|
106
68
|
payload: unknown,
|
107
|
-
|
108
|
-
|
109
|
-
): Promise<void> {
|
69
|
+
{ contentType = 'application/json', ...options }: WriteResponseOptions = {},
|
70
|
+
): void {
|
110
71
|
const buffer = Buffer.from(JSON.stringify(payload))
|
111
|
-
|
72
|
+
writeBuffer(res, buffer, { ...options, contentType })
|
112
73
|
}
|
113
74
|
|
114
|
-
export function
|
75
|
+
export function staticJsonMiddleware(
|
115
76
|
value: unknown,
|
116
|
-
contentType = 'application/json',
|
117
|
-
status = 200,
|
77
|
+
{ contentType = 'application/json', ...options }: WriteResponseOptions = {},
|
118
78
|
): Handler<unknown> {
|
119
79
|
const buffer = Buffer.from(JSON.stringify(value))
|
120
|
-
|
121
|
-
|
80
|
+
const staticOptions: WriteResponseOptions = { ...options, contentType }
|
81
|
+
return function (req, res) {
|
82
|
+
writeBuffer(res, buffer, staticOptions)
|
122
83
|
}
|
123
84
|
}
|
124
85
|
|
125
|
-
export
|
86
|
+
export function writeHtml(
|
126
87
|
res: ServerResponse,
|
127
88
|
html: Buffer | string,
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
const buffer = Buffer.isBuffer(html) ? html : Buffer.from(html)
|
132
|
-
return writeBuffer(res, buffer, contentType, status)
|
89
|
+
{ contentType = 'text/html', ...options }: WriteResponseOptions = {},
|
90
|
+
): void {
|
91
|
+
writeBuffer(res, html, { ...options, contentType })
|
133
92
|
}
|
package/src/oauth-provider.ts
CHANGED
@@ -29,6 +29,8 @@ import {
|
|
29
29
|
oauthTokenIdentificationSchema,
|
30
30
|
oauthTokenRequestSchema,
|
31
31
|
} from '@atproto/oauth-types'
|
32
|
+
import { mediaType } from '@hapi/accept'
|
33
|
+
import createHttpError from 'http-errors'
|
32
34
|
import type { Redis, RedisOptions } from 'ioredis'
|
33
35
|
import z, { ZodError } from 'zod'
|
34
36
|
|
@@ -75,7 +77,7 @@ import {
|
|
75
77
|
combineMiddlewares,
|
76
78
|
parseHttpRequest,
|
77
79
|
setupCsrfToken,
|
78
|
-
|
80
|
+
staticJsonMiddleware,
|
79
81
|
validateCsrfToken,
|
80
82
|
validateFetchDest,
|
81
83
|
validateFetchMode,
|
@@ -1028,7 +1030,7 @@ export class OAuthProvider extends OAuthVerifier {
|
|
1028
1030
|
res.setHeader('Cache-Control', 'max-age=300')
|
1029
1031
|
next()
|
1030
1032
|
},
|
1031
|
-
|
1033
|
+
staticJsonMiddleware(json),
|
1032
1034
|
])
|
1033
1035
|
|
1034
1036
|
/**
|
@@ -1056,9 +1058,18 @@ export class OAuthProvider extends OAuthVerifier {
|
|
1056
1058
|
}
|
1057
1059
|
|
1058
1060
|
try {
|
1061
|
+
// Ensure we can agree on a content encoding & type before starting to
|
1062
|
+
// build the JSON response.
|
1063
|
+
if (!mediaType(req.headers['accept'], ['application/json'])) {
|
1064
|
+
throw createHttpError(406, 'Unsupported media type')
|
1065
|
+
}
|
1066
|
+
|
1059
1067
|
const result = await buildJson.call(this, req, res)
|
1060
|
-
if (result !== undefined)
|
1061
|
-
|
1068
|
+
if (result !== undefined) {
|
1069
|
+
writeJson(res, result, { status })
|
1070
|
+
} else if (!res.headersSent) {
|
1071
|
+
res.writeHead(status ?? 204).end()
|
1072
|
+
}
|
1062
1073
|
} catch (err) {
|
1063
1074
|
if (!res.headersSent) {
|
1064
1075
|
if (err instanceof WWWAuthenticateError) {
|
@@ -1067,7 +1078,9 @@ export class OAuthProvider extends OAuthVerifier {
|
|
1067
1078
|
res.appendHeader('Access-Control-Expose-Headers', name)
|
1068
1079
|
}
|
1069
1080
|
|
1070
|
-
|
1081
|
+
const payload = buildErrorPayload(err)
|
1082
|
+
const status = buildErrorStatus(err)
|
1083
|
+
writeJson(res, payload, { status })
|
1071
1084
|
} else {
|
1072
1085
|
res.destroy()
|
1073
1086
|
}
|
@@ -1096,11 +1109,6 @@ export class OAuthProvider extends OAuthVerifier {
|
|
1096
1109
|
validateSameOrigin(req, res, issuerOrigin)
|
1097
1110
|
|
1098
1111
|
await handler.call(this, req, res)
|
1099
|
-
|
1100
|
-
// Should never happen (fool proofing)
|
1101
|
-
if (!res.headersSent) {
|
1102
|
-
throw new Error('Navigation handler did not send a response')
|
1103
|
-
}
|
1104
1112
|
} catch (err) {
|
1105
1113
|
onError?.(
|
1106
1114
|
req,
|
package/src/oauth-verifier.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
import { Key, Keyset, isSignedJwt } from '@atproto/jwk'
|
2
2
|
import {
|
3
3
|
OAuthAccessToken,
|
4
|
+
OAuthIssuerIdentifier,
|
4
5
|
OAuthTokenType,
|
5
6
|
oauthIssuerIdentifierSchema,
|
6
7
|
} from '@atproto/oauth-types'
|
@@ -77,7 +78,7 @@ export {
|
|
77
78
|
}
|
78
79
|
|
79
80
|
export class OAuthVerifier {
|
80
|
-
public readonly issuer:
|
81
|
+
public readonly issuer: OAuthIssuerIdentifier
|
81
82
|
public readonly keyset: Keyset
|
82
83
|
|
83
84
|
protected readonly accessTokenType: AccessTokenType
|
@@ -8,7 +8,7 @@ import {
|
|
8
8
|
Html,
|
9
9
|
js,
|
10
10
|
} from '../lib/html/index.js'
|
11
|
-
import { writeHtml } from '../lib/http/response.js'
|
11
|
+
import { writeHtml, WriteResponseOptions } from '../lib/http/response.js'
|
12
12
|
|
13
13
|
export function declareBackendData(name: string, data: unknown) {
|
14
14
|
// The script tag is removed after the data is assigned to the global variable
|
@@ -18,9 +18,11 @@ export function declareBackendData(name: string, data: unknown) {
|
|
18
18
|
return js`window[${name}]=${data};document.currentScript.remove();`
|
19
19
|
}
|
20
20
|
|
21
|
+
export type SendWebPageOptions = BuildDocumentOptions & WriteResponseOptions
|
22
|
+
|
21
23
|
export async function sendWebPage(
|
22
24
|
res: ServerResponse,
|
23
|
-
|
25
|
+
options: SendWebPageOptions,
|
24
26
|
): Promise<void> {
|
25
27
|
// @TODO: make these headers configurable (?)
|
26
28
|
res.setHeader('Permissions-Policy', 'otp-credentials=*, document-domain=()')
|
@@ -53,7 +55,7 @@ export async function sendWebPage(
|
|
53
55
|
|
54
56
|
const html = buildDocument(options)
|
55
57
|
|
56
|
-
return writeHtml(res, html.toString(),
|
58
|
+
return writeHtml(res, html.toString(), options)
|
57
59
|
}
|
58
60
|
|
59
61
|
function assetToHash(asset: Html | AssetRef): string {
|