node.js - Bluemix - 对象存储 - node.js - pkgcloud - openstack 返回 401

标签 node.js authorization ibm-cloud openstack pkgcloud

我正在尝试将 pkgcloud (node.js) openstack 与 bluemix 对象存储结合使用,但是当我将所有请求的参数放在官方页面上时,它总是返回 401。我尝试按照 bluemix 上的描述使用 postman 并且它有效。

最佳答案

我创建了一个package ,能够对其进行正确授权。它只是 pkgcloud 的副本,并进行了一些修复。

编辑:它正在工作! V2 支持被 bluemix 取消了,现在只有 V3 支持,但我再次发现了问题。

记住使用最新版本(2.0.0)

这就是您现在可以使用它的方式:

var pkgcloud = require('pkgcloud-bluemix-objectstorage');

// Create a config object
    var config = {};

// Specify Openstack as the provider
    config.provider = "openstack";

// Authentication url
    config.authUrl = 'https://identity.open.softlayer.com/';
    config.region= 'dallas';

// Use the service catalog
    config.useServiceCatalog = true;

// true for applications running inside Bluemix, otherwise false
    config.useInternal = false;

// projectId as provided in your Service Credentials
    config.tenantId = 'xxx';

// userId as provided in your Service Credentials
    config.userId = 'xxx';

// username as provided in your Service Credentials
    config.username = 'xxx';

// password as provided in your Service Credentials
    config.password = 'xxx';

// This is part which is NOT in original pkgcloud. This is how it works with newest version of bluemix and pkgcloud at 22.12.2015. 
//In reality, anything you put in this config.auth will be send in body to server, so if you need change anything to make it work, you can. PS : Yes, these are the same credentials as you put to config before. 
//I do not fill this automatically to make it transparent.

config.auth = {
    forceUri  : "https://identity.open.softlayer.com/v3/auth/tokens", //force uri to v3, usually you take the baseurl for authentication and add this to it /v3/auth/tokens (at least in bluemix)    
    interfaceName : "public", //use public for apps outside bluemix and internal for apps inside bluemix. There is also admin interface, I personally do not know, what it is for.
    "identity": {
        "methods": [
            "password"
        ],
        "password": {
            "user": {
                "id": "***", //userId
                "password": "***" //userPassword
            }
        }
    },
    "scope": {
        "project": {
            "id": "***" //projectId
        }
    }
};

    console.log("config: " + JSON.stringify(config));

// Create a pkgcloud storage client
    var storageClient = pkgcloud.storage.createClient(config);

// Authenticate to OpenStack
     storageClient.auth(function (error) {
        if (error) {
            console.error("storageClient.auth() : error creating storage client: ", error);
        }
        else {
            // Print the identity object which contains your Keystone token.
            console.log("storageClient.auth() : created storage client: " + JSON.stringify(storageClient._identity));
        }

    });
<小时/>

PS:您应该能够在 bluemix 之外连接到此服务,因此您可以在本地主机上测试它。

<小时/>

下面的行适用于版本 1.2.3 的旧内容,仅当您想使用 2016 年 1 月之前与 bluemix 配合使用的 v2 版本的 pkgcloud 时才需要阅读

编辑: 看来bluemix关闭了对v2 openstack的支持,只支持v3,而pkgcloud根本不支持v3。所以这不再起作用(至少对我来说)。

<小时/>

问题实际上出在 pkgcloud 和 bluemix 授权过程之间。 Bluemix 预计会有一些不同的授权。我创建了一个package ,能够对其进行正确授权。它只是 pkgcloud 的副本,并进行了一些修复。

这就是你如何使用它:

var pkgcloud = require('pkgcloud-bluemix-objectstorage');

// Create a config object
    var config = {};

// Specify Openstack as the provider
    config.provider = "openstack";

// Authentication url
    config.authUrl = 'https://identity.open.softlayer.com/';
    config.region= 'dallas';

// Use the service catalog
    config.useServiceCatalog = true;

// true for applications running inside Bluemix, otherwise false
    config.useInternal = false;

// projectId as provided in your Service Credentials
    config.tenantId = 'xxx';

// userId as provided in your Service Credentials
    config.userId = 'xxx';

// username as provided in your Service Credentials
    config.username = 'xxx';

// password as provided in your Service Credentials
    config.password = 'xxx';

// This is part which is NOT in original pkgcloud. This is how it works with newest version of bluemix and pkgcloud at 22.12.2015. 
//In reality, anything you put in this config.auth will be send in body to server, so if you need change anything to make it work, you can. PS : Yes, these are the same credentials as you put to config before. 
//I do not fill this automatically to make it transparent.

    config.auth = {
        tenantId: "xxx", //projectId
        passwordCredentials: {
            userId: "xxx", //userId
            password: "xxx" //password
        }
    };

    console.log("config: " + JSON.stringify(config));

// Create a pkgcloud storage client
    var storageClient = pkgcloud.storage.createClient(config);

// Authenticate to OpenStack
     storageClient.auth(function (error) {
        if (error) {
            console.error("storageClient.auth() : error creating storage client: ", error);
        }
        else {
            // Print the identity object which contains your Keystone token.
            console.log("storageClient.auth() : created storage client: " + JSON.stringify(storageClient._identity));
        }

    });

关于node.js - Bluemix - 对象存储 - node.js - pkgcloud - openstack 返回 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34415631/

相关文章:

javascript - express.js - 服务器监听但本地主机拒绝连接

c# - WebApi 从 HttpActionContext 序列化对象

asp.net-mvc-3 - ASP.NET Authorize属性和Admin用户角色

python - 如何在 flask 中获取http header ?

virtual-machine - 在 Bluemix VM 上安装 block 存储设备

javascript - 将数据从 API 加载到 highcharts vue 组件中

javascript - 使用 env 文件的 NestJs TypeORM 配置

javascript - 如何从 react 组件进行远程服务器调用?

java - 如何将 SSL 证书添加到 Bluemix java Cloud Foundry 应用程序?

java - 使用 Java/Liberty 连接到 Bluemix 上的 DB2 数据库