Bluemix,SSO:从移动应用程序调用REST服务(公共客户端,本机应用程序)

时间:2015-10-15 15:46:26

标签: web-services oauth client single-sign-on ibm-cloud

我有一个Bluemix Web应用程序(Liberty for Java),它实现了一些Web服务。应从移动应用程序(Android)调用这些Web服务。我现在通过将其绑定到Bluemix Single Sign On服务(SSO)以及在SSO服务中创建的云目录来保护此Web应用程序。从Web浏览器使用Web应用程序可以正常工作;但是,我在从SSO服务获取访问令牌时遇到问题,这将允许移动应用程序调用服务。

从OAuth2规范(IETF RFC 6749)中,我认为执行此操作的适当方法是"本机应用程序"与公共客户"公共客户" (如OAuth2规范第2.1条所述)使用"密码"授权类型(OAuth2规范,条款4.3和#34;资源所有者密码凭证授权和#34;)。

我为此目的使用了Spring for Android框架,这个代码看起来像这样:

ResourceOwnerPasswordResourceDetails resourceDetails =
    new ResourceOwnerPasswordResourceDetails();
resourceDetails.setId("dtu-se2-e15-cloud-directory");
resourceDetails.setAccessTokenUri(APP_SSO_API_ACCESS_TOKEN_URI);
resourceDetails.setClientId(APP_SSO_API_CLIENT_ID);
resourceDetails.setClientSecret(APP_SSO_API_CLIENT_SECRET);
resourceDetails.setGrantType("password");
resourceDetails.setScope(Arrays.asList(SCOPE));
resourceDetails.setUsername(USERNAME);
resourceDetails.setPassword(PASSWORD);

OAuth2RestTemplate restTemplate = new OAuth2RestTemplate(resourceDetails); 
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

UserPosition newPosition = restTemplate.postForObject(
    POST_POSITION_SERVICE_URI, position, UserPosition.class);

但是,我不认为这些代码很重要,最终我的实验是直接用curl获取访问令牌:

实际上,我尝试使用两个具有不同OAuth2令牌端点的不同客户端:

  • 我在Cloud目录中创建了一个客户端(和客户端凭据),这是我在Bluemix SSO服务中创建的。我尝试了OAuth2令牌端点URI和创建的客户端凭据。但似乎此端点不支持授权类型"密码"一点都不该端点似乎不被视为公共客户端。

  • 我还尝试了Web应用程序本身的凭据和OAuth令牌端点URI(我在 VCAP_SERVICES 环境变量中查找)。这个终点似乎支持授权类型"密码&#34 ;;但是我能想到的所有请求变体都在不断响应: invalid_resource_owner_credential

正如我所说,我使用curl尝试了许多不同的请求变体 令牌端点:

  • 使用两个SSO服务的令牌端点URI和Web应用程序凭据 以及在云目录API Access

  • 中创建的那个
  • 尝试了GET和POST(没有任何区别)

  • 尝试内容类型:application / x-www-form-urlencoded Content-Type:application / json (两者似乎都有相同的效果)

  • 仅提供client_id(总是不成功)

  • 在正文或参数中提供客户端凭据,以及 标题中的验证信息(实际上,我不喜欢这个想法 为Android应用程序提供客户端密钥,但我也尝试过这样做;

  • 作为用户名,我尝试了在Web浏览器重定向中创建的名称 注册新用户时;但我也尝试过Principal的用户名 请求的安全上下文将提供(成功调用时) 来自用户登录的Web浏览器的服务);我甚至试过了校长 accessId(这些都不起作用,我总是得到: invalid_resource_owner_credential

  • 使用了不同的范围,而且根本没有

上述(以及其中的不同组合)都不会导致成功 响应和用户的访问令牌。最好的"我能得到的是一个回应 invalid_resource_owner_credential (让我相信至少客户是 在某些情况下被接受)。

不幸的是,我找不到很多可以配置客户端的东西 访问(特别是公共客户端),我没有找到太多的文档 。支持OAuth2协议的哪个子集(授权类型和配置文件) Bluemix SSO服务和附加的云目录。

任何人都可以告诉我如何使用Bluemix Web应用程序进行身份验证 (Liberty for Java)来自移动应用程序(Android)作为公共客户端或如何设置 Bluemix Web应用程序和它所绑定的SSO服务,以便这样做 可能。如果它很重要,我正在和美国南部的"美国南部" 地区以及Bluemix的IBM Academic Initiative会员帐户。

我更喜欢一个解决方案,移动应用程序不需要知道客户端 秘密,但如果这是目前使这项工作的唯一方法,添加客户端 移动应用程序的凭据就可以了。

我很感激任何帮助解决这个问题,提前谢谢,

Ekkart

1 个答案:

答案 0 :(得分:0)

Bluemix有一项名为移动客户端访问的移动专用服务,可以帮助您提高移动应用的安全性。要阅读它,请登录Bluemix并在Mobile类别下查找。要在此处提出相关问题,请使用或搜索[bluemix-mobile-services]标记。