Forward Authentication to Authgear Resolver Endpoint
Authenticate the incoming HTTP requests by forwarding Authentication to Authgear Resolver Endpoint
In this section, we will explain how to set up reverse proxy in NGINX to protect your app server from unauthorized access with the Authgear resolver.
You can also use the forward authentication features of the other popular reverse proxy. e.g.

Authgear Resolver Endpoint

Authgear provides an endpoint for forward authentication. Subrequests should be made to the following endpoint for authentication.
https://<your_app_endpoint>/_resolver/resolve

How Forward Authentication works

  1. 1.
    After the user is logged in, send application request to your server from the client app with access token/cookies.
  2. 2.
    Set up a reverse proxy in your infrastructure to authenticate HTTP requests. The reverse proxy will forward the incoming HTTP requests without the request body to the Authgear Resolver Endpoint.
  3. 3.
    Authgear resolver parses the access token and returns HTTP headers including the user login state. The headers are starting with x-authgear-.
  4. 4.
    You have to instruct your reverse proxy to include those extra headers, before forwarding the request to your backend server.
  5. 5.
    Your backend server looks at the headers and response to the client app accordingly. e.g. Returns user's content or HTTP 401 if the user is not logged in.
There are so many reverse proxies available in the wild. So here we are going to illustrate the idea of using Nginx as the reverse proxy.

Using Nginx as the reverse proxy

We will use the module auth_request in NGINX. The module is not built by default, it should be enabled with the --with-http_auth_request_moduleconfiguration parameter.
Run this command and verify that the output includes --with-http_auth_request_module:
1
$ nginx -V 2>&1 | grep -- 'http_auth_request_module'
Copied!
The trick here is to declare an internal location and use auth_request to initiate a subrequest to the resolved endpoint.

Example configuration

1
server {
2
# Use variable in proxy_pass with resolver to respect DNS TTL.
3
# Note that /etc/hosts and /etc/resolv.conf are NOT consulted if resolver is used.
4
# See https://www.nginx.com/blog/dns-service-discovery-nginx-plus/
5
resolver 8.8.8.8;
6
7
# Location that requires request authentication
8
location / {
9
set $backend http://www.mycompany.com;
10
proxy_pass $backend;
11
proxy_set_header Host $host;
12
# Specify the auth_request directive to initiate subrequests to the to the internal location.
13
# This corresponds to the Step 2.
14
auth_request /_auth;
15
16
# Copy the `x-authgear-*` headers from the response of the subrequest to Nginx variables.
17
# This corresponds to the Step 3.
18
auth_request_set $x_authgear_session_valid $upstream_http_x_authgear_session_valid;
19
auth_request_set $x_authgear_user_id $upstream_http_x_authgear_user_id;
20
auth_request_set $x_authgear_user_anonymous $upstream_http_x_authgear_user_anonymous;
21
auth_request_set $x_authgear_user_verified $upstream_http_x_authgear_user_verified;
22
auth_request_set $x_authgear_session_acr $upstream_http_x_authgear_session_acr;
23
auth_request_set $x_authgear_session_amr $upstream_http_x_authgear_session_amr;
24
25
# Include the headers in the request that will be sent to your backend server.
26
# This corresponds to the Step 4.
27
proxy_set_header x-authgear-session-valid $x_authgear_session_valid;
28
proxy_set_header x-authgear-user-id $x_authgear_user_id;
29
proxy_set_header x-authgear-user-anonymous $x_authgear_user_anonymous;
30
proxy_set_header x-authgear-user-verified $x_authgear_user_verified;
31
proxy_set_header x-authgear-session-acr $x_authgear_session_acr;
32
proxy_set_header x-authgear-session-amr $x_authgear_session_amr;
33
34
# Your backend must inspect the request headers to determine whether the request is authenticated or not.
35
# This corresponds to the Step 5.
36
}
37
38
location = /_auth {
39
# Set this location for internal use only
40
internal;
41
set $resolver https://<YOUR_AUTHGEAR_ENDPOINT>/_resolver/resolve;
42
proxy_pass $resolver;
43
# The body is supposed to be consumed by your backend server.
44
# Pass only the headers to the resolver
45
proxy_pass_request_body off;
46
proxy_set_header Content-Length "";
47
}
48
}
Copied!
See docs for auth_request in NGINX for more details. http://nginx.org/en/docs/http/ngx_http_auth_request_module.html

Optimizing the performance

If the reverse proxy, Authgear, and your backend server are in different regions, authenticating every request could result in a huge downgrade in the performance.
You may consider enabling caching.
1
http {
2
# ...
3
proxy_cache_path /tmp/cache keys_zone=auth_cache:10m;
4
5
# The server block.
6
server {
7
# ...
8
location = /_auth {
9
# ...
10
proxy_cache auth_cache;
11
proxy_cache_key "$cookie_session|$http_authorization";
12
proxy_cache_valid 200 10m; # Adjust cache duration as desired.
13
}
14
}
15
}
Copied!

Reference on the headers

Last modified 2mo ago