node.jsauthorizationibm-cloudopenstackpkgcloud

Bluemix - object storage - node.js - pkgcloud - openstack returns 401


I am trying to use pkgcloud (node.js) openstack with bluemix object storage, but when I put all the requested parameters as on official page, it always returns 401. I tried using postman as described on bluemix and it works.


Solution

  • I created a package, which is able to to authorize it right. It is just a copy of pkgcloud, with a few fixes.

    EDIT: IT IS WORKING! The V2 supports was shot down by bluemix and it has only V3 support now, but I once again find the issues.

    Remember to use newest version (2.0.0)

    So this is how you can use it now :

    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 : You should be able to connect to this service outside of bluemix, therefore you can test it on your localhost.


    Lines below are for old content for version 1.2.3, read only if you want to use v2 version of pkgcloud which was working with bluemix before January 2016

    EDIT: It looks like that bluemix shut down support for v2 openstack and only supports v3, which is not supported by pkgcloud at all. So this does not work anymore (at least for me).


    The problem is actually between pkgcloud and bluemix authorization process. Bluemix is expecting a little diffent authorization. I created a package, which is able to to authorize it right. It is just a copy of pkgcloud, with a few fixes.

    And this is how you can use it :

    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));
            }
    
        });