首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与对象存储的Java连接返回未经授权的401

与对象存储的Java连接返回未经授权的401
EN

Stack Overflow用户
提问于 2015-12-07 17:46:02
回答 3查看 347关注 0票数 0

我写了一个在对象存储中保存文件的应用程序。我在连接到对象存储区时遇到问题,在Bluemix上连接返回错误(AuthenticationException{message=Unauthorized,status=401})

我使用的是openstack4j实现,下面是我的代码:

代码语言:javascript
复制
String envServices = System.getenv("VCAP_SERVICES");
    if (envServices != null) {
        JSONParser parser = new JSONParser();
        Object obj = parser.parse(envServices);
        JSONObject jsonObject = (JSONObject) obj;
        JSONArray vcapArray = (JSONArray) jsonObject.get("Object-Storage");
        JSONObject vcap = (JSONObject) vcapArray.get(0);
        JSONObject credentials = (JSONObject) vcap.get("credentials");
        username = credentials.get("username").toString();
        password = credentials.get("password").toString();
        auth_url = credentials.get("auth_url").toString() + "/v3";
        domain = credentials.get("domainId").toString();
        project = credentials.get("projectId").toString();
    } else {
        username = "someuser";
        password = "somepassword";
        auth_url = "https://identity.open.softlayer.com";
        domain = "sfsd";
        project = "object_storage_xxxxxxx";
    }
    Identifier domainIdent = Identifier.byName(domain);
    Identifier projectIdent = Identifier.byName(project);


    OSClient os = OSFactory.builderV3().endpoint(auth_url).credentials(username, password,domainIdent).scopeToProject(projectIdent, domainIdent)
            .authenticate();
    objectStorage = os.objectStorage();
    account = objectStorage.account().get();

任何帮助都将不胜感激。资产

EN

回答 3

Stack Overflow用户

发布于 2015-12-07 17:59:00

您的VCAP_SERVICES如下:

代码语言:javascript
复制
{
"Object-Storage": [
{
  "name": "Object-Storage - YP",
  "label": "Object-Storage",
  "plan": "Free",
  "credentials": {
     "auth_url": "https://identity.open.softlayer.com",
     "project": "object_storage_d049255b",
     "projectId": "0f47b41b06d047f9aae3b33f1db061ed",
     "region": "dallas",
     "userId": "ad78b2a3f843466988afd077731c61fc",
     "username": "user_202db1f8a7aa3f3ac51ec68f10dbe7dc29070bc7",
     "password": "K/jyIi2jR=1?D.TP",
     "domainId": "2df6373c549e49f8973fb6d22ab18c1a",
     "domainName": "639347"
    }
   }
  ]
}

因此,您必须更改以下行:

代码语言:javascript
复制
domain = credentials.get("domainId").toString();
project = credentials.get("projectId").toString();

通过以下方式:

代码语言:javascript
复制
domain = credentials.get("domainName").toString();
project = credentials.get("project").toString();
票数 0
EN

Stack Overflow用户

发布于 2016-09-02 18:02:42

这段代码将帮助您将对象存储服务连接到您的应用程序

代码语言:javascript
复制
String envServices = System.getenv("VCAP_SERVICES");
JSONParser parser = new JSONParser();

try{

Object obj = parser.parse(envServices);
JSONObject jsonObject = (JSONObject) obj;
JSONArray vcapArray = (JSONArray) jsonObject.get("Object-Storage");
JSONObject vcap = (JSONObject) vcapArray.get(0);
JSONObject credentials = (JSONObject) vcap.get("credentials");
String userId = credentials.get("userId").toString();
String password = credentials.get("password").toString();
String auth_url = credentials.get("auth_url").toString() + "/v3";
String domain = credentials.get("domainName").toString();
String project = credentials.get("project").toString();
Identifier domainIdent = Identifier.byName(domain);
Identifier projectIdent = Identifier.byName(project);

OSClient os = OSFactory.builderV3()
              .endpoint(auth_url)
              .credentials(userId, password)
              .scopeToProject(projectIdent, domainIdent)
              .authenticate();
SwiftAccount account = os.objectStorage().account().get();

}catch(Exception e){
   e.printStackTrace();
}
票数 0
EN

Stack Overflow用户

发布于 2017-02-25 00:06:33

问题是这行>> Identifier domainIdent = Identifier.byName(domain);

它应该像这样的>> Identifier domainIdent = Identifier.byId(domain);,因为您传递的是域名ID,而不是域名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34130541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档