web-services - Bluemix,SSO:从移动应用程序(公共(public)客户端, native 应用程序)调用REST服务

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

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

根据OAuth2规范(IETF RFC 6749),我认为执行此操作的适当方法是使用“密码”授权将“本机应用程序”配置文件与“公共客户端”(如OAuth2 Spec的第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令牌端点的两个不同客户端:


我在Bluemix SSO服务中创建的Cloud目录中创建了一个客户端(和客户端凭证)。我尝试了OAuth2令牌端点URI和创建的客户端凭据。但是似乎该端点根本不支持授予类型“ password”。端点似乎没有将此客户端视为公共客户端。
我还尝试了Web应用程序本身的凭据和OAuth令牌端点URI(我在VCAP_SERVICES环境变量中进行了查询)。这个端点似乎支持授予类型“ password”。但是我能想到的所有请求变体都一直在响应:invalid_resource_owner_credential。


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


使用两个SSO服务的令牌端点URI和Web应用程序凭据
以及在云目录API访问中创建的一个
尝试GET和POST(没有任何区别)
尝试过的Content-Type:application / x-www-form-urlencoded和
内容类型:application / json(它们似乎都具有相同的效果)
仅提供client_id(始终不成功)
在正文或参数中提供客户端凭据,以及
标头中的身份验证信息(实际上,我不喜欢这个想法
向Android应用提供客户端机密的信息,但我也尝试过这样做);
作为用户名,我尝试使用在Web浏览器重定向中创建的名称
注册新用户时;但是我也尝试了校长的用户名
请求的安全上下文将提供(成功调用时
用户登录后通过网络浏览器提供的服务);我什至尝试了校长的
accessId(这些都不起作用,我总是得到:invalid_resource_owner_credential)
使用了不同的范围,根本没有


以上所有内容(及其不同组合)均不会成功
用户的响应和访问令牌。我能得到的“最好”是回应
invalid_resource_owner_credential(让我相信至少客户端是
在某些情况下被接受)。

不幸的是,我没有发现许多可以配置的有关客户端的内容
访问(尤其是公共客户),但我没有找到太多有关
OAuth2协议的哪些子集(授权类型和配置文件)受
Bluemix SSO服务和附加的云目录。

谁能告诉我如何使用Bluemix Web应用程序进行认证
移动应用(Android)中作为公共客户端访问(Liberty for Java)或如何设置
建立Bluemix Web应用程序和绑定到的SSO服务,以便
可能。以防万一,我正在“美国南部”的Bluemix工作。
地区,并在Bluemix的IBM Academic Initiative会员帐户下。

我希望有一个解决方案,其中移动应用无需了解客户端
机密,但如果这是目前唯一可行的方法,请添加客户端
移动应用程序的凭据就可以了。

希望对这个问题有任何帮助,在此先感谢您,

埃卡特

最佳答案

Bluemix具有一项称为“移动客户端访问”的特定于移动设备的服务,该服务可以帮助提高移动应用程序的安全性。要了解它,请登录Bluemix并在Mobile类别下查找它。要在此处询问问题,请使用或使用[bluemix-mobile-services]标签进行搜索。

关于web-services - Bluemix,SSO:从移动应用程序(公共(public)客户端, native 应用程序)调用REST服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152954/

相关文章:

c++ - c++客户端和node.js服务器示例

java - ElasticSearch bool 查询请求

c# - WCF 单一身份验证多端点

c# - 一次调用多个 Web 服务

authentication - 使用第一方移动和单页应用程序的 OAuth 2 密码授予

authentication - 在Web Api 2中授予刷新 token 时更新角色

web-services - 给定国家/地区的所有城市 Google-map

c# - 如何更改 WSDL 客户端的预期内容类型?

Facebook - OAuth token - redirect_uri 不是绝对 URL

javascript - 客户端持久化存储