Как передать Bearer-токен через браузер

Настроил nginx (пока что просто выдается листинг директорий) на проверку наличия в запросе заголовка с Bearer-токеном:

Authorization: Bearer #####

Реализация через такой способ в nginx.conf:

http {
    ///
    # Mapping Bearer tokens
    map $http_authorization $is_auth {
        default         false;
        "Bearer #####"  true;
    }
    ///
    
    server {
        listen 443 ssl http2;
        ///
        # Bearer authorization
        if ($is_auth = false) {
            return 401;
        }
        ///
    }
}

Доступ к серверу через Postman или curl в норме. Но возник вопрос - можно ли каким-то образом в браузере получить доступ к такому серверу?

Пробовал указать как параметр URL, но это не работает - надеялся на то, что это сработает по аналогии с Basic Authentication внутри URL http://username:[email protected]/:

https://Authorization=%22Bearer%20TOKEN%[email protected]/
https://Authorization:%22Bearer%20TOKEN%[email protected]/
https://dev-1.su/?Authorization=%22Bearer%20TOKEN%22
https://dev-1.su/?Authorization:%22Bearer%20TOKEN%22

Есть ли вариант передать Bearer-токен через браузер? Требуется ли как-то для этого донастроить nginx?


Ответы (1 шт):

Автор решения: mrgervant

На enSO в одном из ответов на вопрос "Basic HTTP and Bearer Token Authentication" сообщается, что можно использовать параметр URI access_token для передачи Bearer-токена:

URI Query Parameter: access_token=mytoken123

В моем nginx такой способ не сработал по умолчанию.

Однако можно написать дополнительный map для поиска токена в URI:

http {
    ///
    # Mapping request for authorization token
    map $request_uri $authorization_token {
        # Если не нашли параметр в URI - пытаемся найти в заголовках
        default $http_authorization;
        # Ищем в URI после "authorization="
        ~*(?<=authorization\=)(?<token>[\S]+)$ "Bearer $token";
    }
    
    # Mapping Bearer tokens
    # В $authorization_token окажется либо параметр URI, либо заголовок
    map $authorization_token $is_auth {
        default         false;
        "Bearer #####"   true;
    }
    ///

В итоге nginx будет реагировать и пропускать URI следующего вида:

https://dev-1.su/?authorization=TOKEN

Однако, как указал @andreymal - браузеры работают с Basic Authentication, но не с Bearer. Из-за этого при переходах по директориям придется в строке браузера каждый раз дописывать ?authorization=TOKEN, т.к. браузер в памяти держать Bearer-токен не будет (в отличии от Basic после ввода логина и пароля).

Поэтому если очень нужно обеспечить доступ через браузер, то проще использовать Basic Authentication. К тому же, такая аутентификация настраивается намного проще.

→ Ссылка