52 lines
1.8 KiB
JavaScript
52 lines
1.8 KiB
JavaScript
import { MastoApiError } from "./catch-errors.js";
|
|
import { OAuthTokens } from "../../../../models/index.js";
|
|
import authenticate from "../../authenticate.js";
|
|
import { AuthHelpers } from "../helpers/auth.js";
|
|
export async function AuthMiddleware(ctx, next) {
|
|
const token = await getTokenFromOAuth(ctx.headers.authorization);
|
|
ctx.appId = token?.appId;
|
|
ctx.user = token?.user ?? null;
|
|
ctx.scopes = token?.scopes ?? [];
|
|
await next();
|
|
}
|
|
export async function getTokenFromOAuth(authorization) {
|
|
if (authorization == null) return null;
|
|
if (authorization.substring(0, 7).toLowerCase() === "bearer ") authorization = authorization.substring(7);
|
|
return OAuthTokens.findOne({
|
|
where: {
|
|
token: authorization,
|
|
active: true
|
|
},
|
|
relations: [
|
|
'user'
|
|
]
|
|
}).then((token)=>{
|
|
if (!token) return null;
|
|
return {
|
|
...token,
|
|
scopes: AuthHelpers.expandScopes(token.scopes)
|
|
};
|
|
});
|
|
}
|
|
export function auth(required, scopes = []) {
|
|
return async function auth(ctx, next) {
|
|
if (required && !ctx.user) throw new MastoApiError(401, "This method requires an authenticated user");
|
|
if (!scopes.every((p)=>ctx.scopes.includes(p))) {
|
|
if (required) throw new MastoApiError(403, "This action is outside the authorized scopes");
|
|
ctx.user = null;
|
|
ctx.scopes = [];
|
|
}
|
|
await next();
|
|
};
|
|
}
|
|
export function MiAuth(required) {
|
|
return async function MiAuth(ctx, next) {
|
|
ctx.miauth = await authenticate(ctx.headers.authorization, null, true).catch((_)=>[
|
|
null,
|
|
null
|
|
]);
|
|
if (required && !ctx.miauth[0]) throw new MastoApiError(401, "Unauthorized");
|
|
await next();
|
|
};
|
|
}
|