BlueMix SingleSignOn,如何在启用 SSO 服务的情况下调用 BlueMix 应用程序的 REST API

BlueMix SingleSignOn, How to call REST API of a BlueMix App with SSO service enabled

我有一个带有几个 RestAPI 调用的 BlueMix 应用程序。将 SignleSignOn 服务添加到此应用程序后,我无法通过应用程序端点进行 RestAPI 调用。有没有办法通过 REST 调用 headers 通过 SSO 的身份验证?

SSO 配置为启用云目录。我应该如何将用户详细信息与 Bluemix 应用程序 Rest api 调用一起传递?

截至目前,我只能使用浏览器通过 SSO 登录应用程序并仅在同一浏览器中执行 REST 调用。

示例 RestCall -> http://myapp.mybluemix.net/sm/metadata

web.xml 摘录:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSc hema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>SolutionManager</display-name>
<filter>
    <filter-name>RequestRedirect</filter-name>
    <filter-class>com.ibm.ba.ssl.RedirectFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>RequestRedirect</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.ibm.ba.sm.auth.AuthenticationFilter</filter-class>
</filter>   
<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>   
<servlet>
    <description>
    </description>
    <display-name>sample</display-name>
    <servlet-name>sample</servlet-name>
    <servlet-class>com.ibm.ba.ers.ErsServlet</servlet-class>
    <enabled>true</enabled>
    <async-supported>false</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>sample</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
<resource-ref>
    <description>MQLight Service</description>
    <res-ref-name>jms/MQLight-mc</res-ref-name>
    <res-type>javax.jms.ConnectionFactory</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

<listener>
  <listener-class>
      com.ibm.ba.SMAppStart
  </listener-class>
</listener>

<security-constraint>
    <display-name>Authenticated Users</display-name>
    <web-resource-collection>
        <web-resource-name>ALL</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>PUT</http-method>
        <http-method>HEAD</http-method>
        <http-method>TRACE</http-method>
        <http-method>POST</http-method>
        <http-method>DELETE</http-method>
        <http-method>OPTIONS</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>Users</role-name>
    </auth-constraint>
</security-constraint>

谢谢, 洛克什

要访问 Bluemix 上的任何服务,您需要提供不记名令牌以随服务一起提供。 要获取不记名令牌,请使用以下 API 调用:

POST http://login.ng.bluemix.net/UAALoginServerWAR/oauth/token

请求body: "grant_type=密码&用户名=[your-bluemix-id]&密码=[your-bluemix-password]

headers: { 'authorization': 'Basic Y2Y6', 'accept': 'application/json', 'content-type' : 'application/x-www-form-urlencoded }

响应 就像: { "access_token": "[value_from_access_token]", "token_type": "bearer", "refresh_token": "[value2]", "expires_in": 43199, "scope": "password.write cloud_controller.write openid cloud_controller.read", "jti":“20e70e6e-5700-476c-bc15-7869c5fb4b07” }

要为您的服务进行 REST 调用,请使用下面提到的 headers:

{'accept': 'application/json', 'content-type': 'application/json',

'authorization': 'bearer[space][value_from_access_token]'}

到目前为止,您收到的答案对于新的 SSO 服务(包括对云中注册表的支持)是不正确的。当您将 SSO 服务添加到您的应用程序时,J2EE 安全约束将应用于您的应用程序并且 SSO 服务成为满足这些安全约束的身份验证源。这最终就是为什么您当前需要浏览器身份验证后获得的浏览器 cookie 才能进行 REST 调用。

没有看到您部署的应用程序 web.xml 和 server.xml 文件,不清楚最好的方法是什么,但是您可能需要构建一个具有明确定义的安全约束的 EAR 文件并使您的 REST API 端点未经身份验证或通过其他机制进行身份验证。