export class AuthUser extends Context.Tag("AuthUser")<
AuthUser,
typeof api.Session.Type
>() {}
export class AuthMiddleware extends HttpApiMiddleware.Tag<AuthMiddleware>()(
"AuthMiddleware",
{
failure: Unauthorized,
provides: AuthUser,
security: {
validateSessionToken: HttpApiSecurity.bearer,
},
optional: false,
},
) {}
const AuthLive = Layer.effect(
AuthMiddleware,
Effect.gen(function* () {
yield* Effect.log("creating Authorization middleware");
return {
validateSessionToken: (bearerToken) =>
Effect.gen(function* () {
// bearerToken itself logs a <redacted>
// the value below logs as [object Object]
yield* Effect.log(
"checking bearer token",
Redacted.value(bearerToken),
);
return {...};
}),
};
}),
);
// how the token is attached on the client just in case
const client = yield* HttpApiClient.make(MyAPI, {
baseUrl: url,
/**
* Add headers to client
*/
transformClient: (client) =>
HttpClient.mapRequest(client, (request) =>
HttpClientRequest.setHeaders(request, {
Authorization: `Bearer ${token}`,
}),
),
});
export class AuthUser extends Context.Tag("AuthUser")<
AuthUser,
typeof api.Session.Type
>() {}
export class AuthMiddleware extends HttpApiMiddleware.Tag<AuthMiddleware>()(
"AuthMiddleware",
{
failure: Unauthorized,
provides: AuthUser,
security: {
validateSessionToken: HttpApiSecurity.bearer,
},
optional: false,
},
) {}
const AuthLive = Layer.effect(
AuthMiddleware,
Effect.gen(function* () {
yield* Effect.log("creating Authorization middleware");
return {
validateSessionToken: (bearerToken) =>
Effect.gen(function* () {
// bearerToken itself logs a <redacted>
// the value below logs as [object Object]
yield* Effect.log(
"checking bearer token",
Redacted.value(bearerToken),
);
return {...};
}),
};
}),
);
// how the token is attached on the client just in case
const client = yield* HttpApiClient.make(MyAPI, {
baseUrl: url,
/**
* Add headers to client
*/
transformClient: (client) =>
HttpClient.mapRequest(client, (request) =>
HttpClientRequest.setHeaders(request, {
Authorization: `Bearer ${token}`,
}),
),
});