Как вызвать безопасное веб-действие OpenWhisk (IBM Cloud Functions) из браузера через CORS? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь вызвать веб-действие Cloud Functions, защищенное аннотацией -a require-whisk-auth my-secret из браузера (JavaScript) через CORS.

Я создал веб-действие и защитил его (см. https://console.bluemix.net/docs/openwhisk/openwhisk_webactions.html#securing-web-actions),, но при вызове действия с использованием JavaScript-извлечения будет возвращен 401 код неавторизованного статуса.

Мой код JavaScript:

var myHeader = new Headers();
myHeader.append('X-Require-Whisk-Auth', 'my-secret');
fetch('https://openwhisk.ng.bluemix.net/api/v1/web/{CLOUD FOUNDRY ORG}_{CLOUD FOUNDRY SPACE}/default/action.json',{
    headers: myHeader,
}).then(function(response) {
    var res = response.text();
    res.then(function(res) {
    var json = JSON.parse(res);
    var token = json.token;
    console.log(token);
    }).catch(function(error) {
        console.log(error);
    });
}).catch(function(error) {
    console.log(error);
});

Ошибка консоли (Chrome):

OPTIONS https://openwhisk.ng.bluemix.net/api/v1/web/{CLOUD FOUNDRY ORG}_{CLOUD FOUNDRY SPACE}/default/action.json 401 (Unauthorized)
Access to fetch at 'https://openwhisk.ng.bluemix.net/api/v1/web/{CLOUD FOUNDRY ORG}_{CLOUD FOUNDRY SPACE}/default/action.json' from origin 'null' 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. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

Я также попытался добавить аннотацию web-custom-options - ibmcloud fn action update /{CLOUD FOUNDRY ORG}_{CLOUD FOUNDRY SPACE}/action --web true -a require-whisk-auth my-secret -a web-custom-options true - для создания пользовательского ответа на запросы OPTIONS, но он не работает.

Это мое действие (action.js):

function main(params) {
    if (params.__ow_method == "options") {
        return {
            headers: {
                'Access-Control-Allow-Methods': 'OPTIONS, GET',
                'Access-Control-Allow-Origin': 'http://127.0.0.1:8080',
                'Access-Control-Allow-Credentials': 'true',
                'Access-Control-Allow-Headers': 'X-Require-Whisk-Auth, Content-Type, authorization'
            },
            statusCode: 200
        }
    }else{
        return {
            headers: {
                'Access-Control-Allow-Methods': 'OPTIONS, GET',
                'Access-Control-Allow-Origin': 'http://127.0.0.1:8080',
                'Access-Control-Allow-Credentials': 'true',
                'Access-Control-Allow-Headers': 'X-Require-Whisk-Auth, Content-Type, authorization',
                'Content-Type': 'application/json'
            },
            body: {'token': token},
            statusCode: 200
        }
    }
}

Как вызывать защищенные веб-действия через CORS с настраиваемым заголовком «X-Require-Whisk-Auth»? (Я должен прикрепить заголовок «X-Require-Whisk-Auth», когда включена аннотация require-whisk-auth.)

...