Files
remark42/site/content/docs/configuration/authorization/index.md
T
Dmitry VerkhoturovandGitHub fb7b6c2cdd Serve the build-independent web assets from the backend (#2181)
* Serve the build-independent web assets from the backend

`privacy.html`, `markdown-help.html` and the `400x400.jpeg` it embeds carry
no template variable, link no script or stylesheet, and are imported by
nothing in the widget. They now live in `backend/app/webassets/assets`,
embedded there, and are served under `/web` alongside the frontend build.

`/web` reads the frontend build first and falls back to them, which is what
lets an operator replace one by dropping a file into `--web-root`. That is
what `privacy.html` needs: it describes remark42.com, while the
authorization guide tells operators to hand its URL to Google and Facebook
as their own application's privacy policy.

Only a missing file falls through. An unreadable file in the web root keeps
reporting as unreadable rather than being silently replaced by the embedded
copy, and a name the filesystem rejects reports as missing rather than as a
server error, both matching what `http.Dir` did.

The dev server serves the same directory, so the Markdown help link in the
comment form resolves on the dev port as well as in production.

The two pages are served as they are written. `markdown-help.html` was
minified before, and its formatted inline stylesheet is most of its 8.5 kB;
that is 2.4 kB more over the wire, behind the hour-long cache header the
file server already sets.

Drops `copy-webpack-plugin`, which had no other pattern, and the stylelint
entries that only ever matched these files.

* Make pnpm dev:app start again

The dev server has been failing to start on two counts, so the flow the
contributing guide documents does not run at all.

`webpack-cli` 4 drives `webpack-dev-server` 5 through the argument order
of an older major, handing it the compiler where it expects the options
object. It rejects that against its schema and exits, complaining about an
unknown `_assetEmittingPreviousFiles` property, which is a field of the
compiler. `webpack-cli` 7 is the release that declares
`webpack-dev-server` 5 as a peer.

Past that, `http-proxy-middleware` resolves to 4.1.1, which no longer
accepts the two-argument call `webpack-dev-server` makes, so the `/api`
and `/auth` proxies throw on startup. It is pulled in by the security
override for CVE-2025-32996, the only override in the file with no upper
bound: `>=2.0.10` matches every later major. Bounding it to the 2.x line
keeps the fix and the API `webpack-dev-server` calls.

With both in place `pnpm dev:app` serves the widget and the pages under
`/web` on port 9000.
2026-08-21 18:43:06 -05:00

11 KiB

title
title
Authorization

OAuth Providers

Authentication is handled by external providers. You should set up OAuth2 for at least one to allow users to comment. It is not mandatory to have all of them, but one should be correctly configured.

Apple

  1. Log in to the developer account.
  2. If you don't have an App ID yet, create one. Later on, you'll need TeamID, which is an "App ID Prefix" value.
  3. Enable the "Sign in with Apple" capability for your App ID in the Certificates, Identifiers & Profiles section.
  4. Create Service ID and bind with App ID from the previous step. Apple will display the description field value to end-users on sign-in. You'll need that service Identifier as a ClientID later on.
  5. Configure "Sign in with Apple" for created Service ID. Add the domain where you will use that auth to "Domains and subdomains" and its Return URLs (like https://example.com/auth/apple/callback to "Return URLs".
  6. Register a New Key (private key) for the "Sign in with Apple" feature and download it, you'll need to put it to /srv/var/apple.p8 path inside the container. Also, write down the private Key ID.
  7. Add your Remark42 domain name and sender email in the Certificates, Identifiers & Profiles >> More section as a new Email Source.

After completing the previous steps, you can configure the Apple auth provider. You'll need to set the following environment variables:

  • AUTH_APPLE_CID (required) - Client ID (App ID or Services ID)
  • AUTH_APPLE_TID (required) - Team ID
  • AUTH_APPLE_KID (required) - Private Key ID
  • AUTH_APPLE_PRIVATE_KEY_FILEPATH (default /srv/var/apple.p8) - Private key file location

Facebook

  1. Open the list of apps on the Facebook Developers Platform
  2. Create a new app with this manual or use an existing app
  3. Open your app and choose "Facebook Login" and then "Web"
  4. Set "Site URL" to your domain, e.g., https://remark42.mysite.com
  5. Under "Facebook login"/"Settings" fill in "Valid OAuth redirect URIs" with your callback URL constructed as domain plus /auth/facebook/callback, e.g. https://remark42.mysite.com/auth/facebook/callback
  6. Select "App Review" and turn the public flag on. This step may ask you to provide a link to your privacy policy
  7. Write down the client ID and secret as AUTH_FACEBOOK_CID and AUTH_FACEBOOK_CSEC

GitHub

  1. Create a new "OAuth App": https://github.com/settings/developers
  2. Fill "Application Name" and "Homepage URL" for your site
  3. Under "Authorization callback URL" enter the correct URL constructed as domain + /auth/github/callback, i.e., https://remark42.mysite.com/auth/github/callback
  4. Take note of the Client ID (as AUTH_GITHUB_CID) and Client Secret (AUTH_GITHUB_CSEC)

Google

  1. Create a new project: https://console.cloud.google.com/projectcreate

  2. Choose the new project from the top right project dropdown (only if another project is selected)

  3. In the project Dashboard center pane, choose "APIs & Services"

  4. In the left Nav pane, choose "Credentials"

  5. In the center pane, choose the "OAuth consent screen" tab.

    • Select "External" and click "Create"
    • Fill in "App name" and select User support email
    • Upload a logo, if you want to
    • In the App Domain section:
      • Application home page - your site URL, e.g., https://mysite.com
      • Application privacy policy link - /web/privacy.html of your Remark42 installation, e.g. https://remark42.mysite.com/web/privacy.html (please check that it works). The page shipped with Remark42 describes remark42.com rather than your site; to serve your own, add a privacy.html alongside the frontend files in the web-root / REMARK_WEB_ROOT directory (/srv/web in the Docker image), which is served in preference to the built-in one. Add it to that directory rather than creating one: once the directory exists it supplies the whole frontend, so a web root holding only a privacy.html leaves the widget unreachable
      • Terms of service - leave empty
    • Authorized domains - your site domain, e.g., mysite.com
    • Developer contact information - add your email, and then click Save and continue
    • On the Scopes tab, just click Save and continue
    • On the Test users, add your email, then click Save and continue
    • Before going to the next step, set the app to "Production" and send it to verification
  6. In the center pane, choose the "Credentials" tab

    • Open the "Create credentials" drop-down
    • Choose "OAuth client ID"
    • Choose "Web application"
    • Application Name is freeform; choose something appropriate, like "Comments on mysite.com"
    • Authorized JavaScript Origins should be your domain, e.g., https://remark42.mysite.com
    • Authorized redirect URIs is the location of OAuth2/callback constructed as domain + /auth/google/callback, e.g., https://remark42.mysite.com/auth/google/callback
    • Click "Create"
  7. Take note of the Client ID (AUTH_GOOGLE_CID) and Client Secret (AUTH_GOOGLE_CSEC)

instructions for Google OAuth2 setup borrowed from oauth2_proxy

Microsoft

  1. Register a new application using the Azure portal
  2. Under "Supported account types" select "Accounts in any organizational directory (Any Microsoft Entra directory - Multitenant) and personal Microsoft accounts"
  3. Under "Authentication/Platform configurations/Web" enter the correct URL constructed as domain + /auth/microsoft/callback, i.e., https://example.mysite.com/auth/microsoft/callback
  4. In "Overview" take note of the Application (client) ID (AUTH_MICROSOFT_CID)
  5. Choose the new project from the top right project dropdown (only if another project is selected)
  6. Select "Certificates & secrets" and click on "+ New Client Secret" (AUTH_MICROSOFT_CSEC)

By default, Remark42 authenticates against the common endpoint, which requires a multi-tenant application. A single-tenant application (signInAudience: AzureADMyOrg) is rejected there with AADSTS50194. The account types the application actually accepts are the intersection of the endpoint and the registration, so selecting personal Microsoft accounts as well is what makes them usable; choose signInAudience: AzureADMultipleOrgs instead to keep sign-in to work or school accounts only. You can check and change the value under "Manifest" for an application that already exists.

To use a different endpoint, set AUTH_MICROSOFT_TENANT to your tenant ID or domain name for a single-tenant Entra ID application (AzureADMyOrg), to organizations for a multi-tenant application accepting work or school accounts only (AzureADMultipleOrgs), or to consumers for an application limited to personal Microsoft accounts (PersonalMicrosoftAccount).

Yandex

  1. Create a new "OAuth App": https://oauth.yandex.com/client/new
  2. Fill "App name" for your site
  3. Under Platforms select "Web services" and enter "Callback URI #1" constructed as domain + /auth/yandex/callback, i.e., https://remark42.mysite.com/auth/yandex/callback
  4. Select Permissions. You need the following permissions only from the "Yandex.Passport API" section:
  • Access to the user avatar
  • Access to username, first name and surname, gender
  1. Fill out the rest of the fields if needed
  2. Take note of the ID (AUTH_YANDEX_CID) and Password (AUTH_YANDEX_CSEC)

For more details refer to Yandex OAuth and Yandex.Passport API documentation.

Patreon

  1. Create a new Patreon client https://www.patreon.com/portal/registration/register-clients
  2. Fill App Name, Description
  3. In the field Redirect URIs enter the correct URI constructed as domain + /auth/patreon/callback, i.e., https://example.mysite.com/auth/patreon/callback
  4. Expand client details and note the Client ID and Client Secret. Those will be used as AUTH_PATREON_CID and AUTH_PATREON_CSEC

Discord Auth Provider

  1. Click on New Application to create Oauth client https://discord.com/developers/applications
  2. After filling "NAME", navigate to "OAuth2" option on the left sidebar
  3. Under "Redirects" enter the correct url constructed as domain + /auth/discord/callback. ie https://remark42.mysite.com/auth/discord/callback
  4. Take note of the CLIENT ID and CLIENT SECRET, as they are values for AUTH_DISCORD_CID and AUTH_DISCORD_CSEC respectively

Custom OAuth2 Provider

You can configure any OAuth2-compatible provider by setting these variables:

  • AUTH_CUSTOM_NAME - provider name used in auth routes
  • AUTH_CUSTOM_CID - OAuth client ID
  • AUTH_CUSTOM_CSEC - OAuth client secret
  • AUTH_CUSTOM_AUTH_URL - authorization endpoint
  • AUTH_CUSTOM_TOKEN_URL - token endpoint
  • AUTH_CUSTOM_INFO_URL - user info endpoint
  • AUTH_CUSTOM_SCOPES - optional scopes, comma-separated
  • AUTH_CUSTOM_ID_FIELD - optional user info field used as unique id (default sub)
  • AUTH_CUSTOM_NAME_FIELD - optional user info field used as display name (default name)
  • AUTH_CUSTOM_PICTURE_FIELD - optional user info field used as avatar URL (default picture)
  • AUTH_CUSTOM_EMAIL_FIELD - optional user info field used as email (default email)

Callback URL format:

https://<remark42-url>/auth/<AUTH_CUSTOM_NAME>/callback

Notes:

  • AUTH_CUSTOM_NAME must match ^[a-z0-9][a-z0-9_-]*$ and should not conflict with built-in providers: email, anonymous, google, github, facebook, yandex, twitter, microsoft, patreon, discord, telegram, dev, apple.
  • If any required custom variable is missing, Remark42 will fail to start.
  • Remark42 currently supports only one custom OAuth2 provider at a time.

Telegram

  1. Contact @BotFather and follow his instructions to create your bot (call it, for example, "My site auth bot")
  2. Write down the resulting token as TELEGRAM_TOKEN into remark42 config, and also set AUTH_TELEGRAM to true to enable telegram auth for your users.

Anonymous

Optionally, anonymous access can be turned on. In this case, an extra anonymous provider will allow logins without any social login with any name satisfying two conditions:

  • the name should be at least three characters long
  • the name has contains only letters, numbers, underscores and spaces