diff --git a/package.json b/package.json
index 5cf338265..0c05d9dab 100644
--- a/package.json
+++ b/package.json
@@ -143,6 +143,7 @@
     "passport": "^0.6.0",
     "passport-google-oauth2": "^0.2.0",
     "passport-oauth2": "^1.6.1",
+    "passport-req": "^0.1.1",
     "passport-slack-oauth2": "^1.1.1",
     "patch-package": "^6.5.1",
     "pg": "^8.8.0",
diff --git a/plugins/req/plugin.json b/plugins/req/plugin.json
new file mode 100644
index 000000000..ae7c40333
--- /dev/null
+++ b/plugins/req/plugin.json
@@ -0,0 +1,4 @@
+{
+  "name": "visiteur",
+  "description": "Adds an req compatible authentication provider."
+}
diff --git a/plugins/req/server/.babelrc b/plugins/req/server/.babelrc
new file mode 100644
index 000000000..c87001bc4
--- /dev/null
+++ b/plugins/req/server/.babelrc
@@ -0,0 +1,3 @@
+{ 
+  "extends": "../../../server/.babelrc"
+}
diff --git a/plugins/req/server/auth/req.ts b/plugins/req/server/auth/req.ts
new file mode 100644
index 000000000..bc03fc6d3
--- /dev/null
+++ b/plugins/req/server/auth/req.ts
@@ -0,0 +1,70 @@
+import passport from "@outlinewiki/koa-passport";
+import type { Context } from "koa";
+import Router from "koa-router";
+import { capitalize } from "lodash";
+import { Strategy as ReqStrategy } from "passport-req";
+import { slugifyDomain } from "@shared/utils/domains";
+import accountProvisioner from "@server/commands/accountProvisioner";
+import env from "@server/env";
+import passportMiddleware from "@server/middlewares/passport";
+import { User } from "@server/models";
+import { AuthenticationResult } from "@server/types";
+import {
+  StateStore,
+  getTeamFromContext,
+  getClientFromContext,
+} from "@server/utils/passport";
+
+const router = new Router();
+const providerName = "req";
+
+export const config = {
+  name: "visiteur",
+  enabled: true,
+};
+
+if (true) {
+  passport.use(
+    new ReqStrategy(
+      async function (req,done) {
+        try {
+          const domain = "domain.tld";
+          const subdomain = domain.split(".")[0];
+          const teamName = capitalize(subdomain);
+          const name = "visiteur";
+          const email = "visiteur@anthropologiebiblique.fr";
+          const result = await accountProvisioner({
+            ip: req.ip,
+            team: {
+              name: teamName,
+              domain,
+              subdomain,
+            },
+            user: {
+              name: name,
+              email: email,
+              avatarUrl: null,
+            },
+            authenticationProvider: {
+              name: providerName,
+              providerId: domain,
+            },
+            authentication: {
+              providerId: "1234",
+              accessToken: null,
+              refreshToken: null,
+              scopes: [],
+            },
+          });
+          return done(null, result.user, result);
+        } catch (err) {
+          return done(err, null);
+        }
+      }
+    )
+  );
+
+  router.get("req", passportMiddleware(providerName));
+}
+
+export default router;
diff --git a/yarn.lock b/yarn.lock
index 524d96791..a0c1cc51f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10179,6 +10179,14 @@ passport-oauth@1.0.x:
     passport-oauth1 "1.x.x"
     passport-oauth2 "1.x.x"
 
+passport-req@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/passport-req/-/passport-req-0.1.1.tgz#451bff1500b3d464a768d42f0762328a21236a18"
+  integrity sha512-9qmM0vD5v7jYLWxezNNCleOw+8IkVAuvOwQ6NJaUuJkdFJTR1KatXH1i5MxWgffx+libLWYLRUPtc6GHOmn+6w==
+  dependencies:
+    passport "~0.1.1"
+    pkginfo "0.2.x"
+
 passport-slack-oauth2@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/passport-slack-oauth2/-/passport-slack-oauth2-1.1.1.tgz#d831ffc3f1e968fcc3622e6ecf41643c8d8f9cbc"
@@ -10201,6 +10209,14 @@ passport@^0.6.0:
     pause "0.0.1"
     utils-merge "^1.0.1"
 
+passport@~0.1.1:
+  version "0.1.18"
+  resolved "https://registry.yarnpkg.com/passport/-/passport-0.1.18.tgz#c8264479dcb6414cadbb66752d12b37e0b6525a1"
+  integrity sha512-qteYojKG/qth7UBbbGU7aqhe5ndJs6YaUkH2B6+7FWQ0OeyYmWknzOATpMhdoSTDcLLliq9n4Fcy1mGs80iUMw==
+  dependencies:
+    pause "0.0.1"
+    pkginfo "0.2.x"
+
 passthrough-counter@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/passthrough-counter/-/passthrough-counter-1.0.0.tgz#1967d9e66da572b5c023c787db112a387ab166fa"
@@ -10410,6 +10426,11 @@ pkg-up@^3.1.0:
   dependencies:
     find-up "^3.0.0"
 
+pkginfo@0.2.x:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.2.3.tgz#7239c42a5ef6c30b8f328439d9b9ff71042490f8"
+  integrity sha512-7W7wTrE/NsY8xv/DTGjwNIyNah81EQH0MWcTzrHL6pOpMocOGZc0Mbdz9aXxSrp+U0mSmkU8jrNCDCfUs3sOBg==
+
 pkginfo@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
