【问题标题】:Bluemix, SSO: Calling REST service from mobile app (public client, native application)Bluemix、SSO:从移动应用程序(公共客户端、本机应用程序)调用 REST 服务
【发布时间】:2015-10-15 15:46:25
【问题描述】:

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

根据 OAuth2 规范 (IETF RFC 6749),我认为执行此操作的适当方法是使用“公共客户端”(如 OAuth2 规范的第 2.1 条规定)的“本机应用程序”配置文件,使用“密码”授予类型(OAuth2 规范,第 4.3 条“资源所有者密码凭据授予”)。

为此,我使用了 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 环境变量中查找)。这个端点似乎支持授权类型“密码”;但我能想到的所有请求变体都在不断响应:invalid_resource_owner_credential

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

  • 将两个 SSO 服务的令牌端点 URI 与 Web 应用程序凭据一起使用 以及在云目录API Access中创建的那个

  • 尝试了 GET 和 POST(没有任何区别)

  • 尝试过 Content-Type: application/x-www-form-urlencodedContent-Type: application/json (它们似乎都具有相同的效果)

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

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

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

  • 使用了不同的作用域,根本没有

以上任何一项(以及它们的不同组合)都不会导致成功 响应和用户的访问令牌。我能得到的“最好的”是回应 invalid_resource_owner_credential(让我相信至少客户是 在某些情况下接受)。

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

谁能告诉我如何使用 Bluemix Web 应用程序进行身份验证 (Liberty for Java) 从移动应用程序 (Android) 作为公共客户端或如何设置 启动 Bluemix Web 应用程序和它所绑定的 SSO 服务,以便 可能的。万一这很重要,我正在“美国南部”与 Bluemix 合作 地区和 Bluemix 的 IBM Academic Initiative 会员帐户。

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

感谢您对此问题的任何帮助,在此先感谢,

埃卡特

【问题讨论】:

  • Bluemix SSO 服务当前不支持此场景。它在路线图中。您实施该计划的时间范围是多少?
  • 感谢您的信息。在我的一门课程的背景下,一些学生项目需要这样做;具体的学生项目已经完成——使用一些变通方法。但是,我可能会在 2016 年秋季继续这些项目(并且可能也需要此功能用于其他学生项目)。所以在 2016 年 8 月之前拥有这个功能会很棒。而且我很确定许多其他人可以使用此功能。

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


【解决方案1】:

Bluemix 有一项名为 Mobile Client Access 的特定于移动设备的服务,它有助于提高移动应用程序的安全性。要了解它,请登录 Bluemix 并在 Mobile 类别下查找它。要在此处提出相关问题,请使用或使用 [bluemix-mobile-services] 标签进行搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多