Проблема CORS с OneLogin при использовании Custom-Allowed-Origin-Header-1 - PullRequest
0 голосов
/ 20 марта 2019

у нас есть проблема с вызовом API для генерации OAuth-токена. Наш звонок выглядит так:

// Reusable variables
var oneloginURL = "https://api.us.onelogin.com";
var oneloginSessionURL = "https://rxsense.onelogin.com";

// Axios objects for AJAX calls, For onelogin calls only
var ONELOGIN_API = axios.create({baseURL: oneloginURL})
var ONELOGIN_SESSION_API = axios.create({baseURL: oneloginSessionURL})

const REQUIRED_CONFIG = {
    ONE_LOGIN: {
        LOGIN: {
            BASE: "https://api.us.onelogin.com",
            METHOD: "POST",
            ROUTE: "/api/1/login/auth"
        },
        TOKEN: {
            BASE: "https://api.us.onelogin.com",
            METHOD: "POST",
            ROUTE: "/auth/oauth2/v2/token"
        },
        SESSION_TOKEN: {
            BASE: "https://rxsense.onelogin.com",
            METHOD: "POST",
            ROUTE: "/session_via_api_token"
        }
    },
}

const services = {
    BASE_URL: baseURL,
    ACCESS: REQUIRED_CONFIG,
    sendRequestForOneLogin: function(service = ONELOGIN_API, method, route, params, config) {
        switch(method) {
            case 'GET': return service.get(route, params);
            case 'POST': return service.post(route, {params,config});
            case 'PUT': return service.put(route, params);
        }
    },
}

// Methods calling the services
generateOneLoginToken: function() {
    let params = {
        'grant_type': 'client_credentials',
    }
    let config = {
        auth: {
            username: "clientname",
            password: "clientsecret",
        },
        headers: {
            "Custom-Allowed-Origin-Header-1": "http://localhost:8080"
        }
    }
    return this.sendRequestForOneLogin(
        ONELOGIN_API,
        this.ACCESS.ONE_LOGIN.TOKEN.METHOD,
        this.ACCESS.ONE_LOGIN.TOKEN.ROUTE,
        params,
        config
    );
},
loginOneLogin: function() {
    let params = {
        'username_or_email': 'uname1',
        'password': 'pass@123',
        'subdomain': 'mydomain'
    }
    let config = {
        headers: {
            "Custom-Allowed-Origin-Header-1": "http://localhost:8080",
            "Authorization": 'bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
        }
    }
    return this.sendRequestForOneLogin(
        ONELOGIN_API,
        this.ACCESS.ONE_LOGIN.LOGIN.METHOD,
        this.ACCESS.ONE_LOGIN.LOGIN.ROUTE,
        params,
        config
    );
},

Отображаемая ошибка:

“Access to XMLHttpRequest at 'https://api.us.onelogin.com/auth/oauth2/v2/token' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.”

Это проблема с использованием localhost в качестве URL? Я знаю, что есть документация, предлагающая использовать заголовок Custom-Allowed-Origin-Header-1 для решения этой проблемы, но мы все еще видим его с нашей стороны. Если мы не сможем использовать localhost в качестве параметра для URL-адреса CORS, сможем ли мы использовать частный IP-адрес сервера, выполняющего вызов?

1 Ответ

0 голосов
/ 19 апреля 2019

Запрос на получение токена доступа не должен выполняться из клиентского JavaScript, поскольку это означает, что вы открыли свой client_secret в Интернете.

OneLogin поддерживает только CORS для генерации токена сеанса.Опять же, вы не должны делать исходный запрос входа в систему из клиентского JavaScript, но у вас есть правильная идея с установкой заголовка «Custom-Allowed-Origin-Header-1» для этого запроса.

Затем вы сделаете запрос на создание сеанса на основе токена, возвращенного из первого запроса.По сути, это вызов на стороне клиента, который возвращает файлы cookie для включения единого входа.https://developers.onelogin.com/api-docs/1/login-page/create-session-via-token

Если вы должны аутентифицировать пользователей со стороны клиента, этот метод не рекомендуется.Пожалуйста, используйте OpenId Connect Неявный поток или Код авторизации потока + PKCE .

...