2
  • drupal サイトのコンテンツを表示する iPad アプリがあります (json ファイルのみを提供します)。
  • IT 部門は、drupal サイトの前に SSO を配置しました。SSO の実装には WebSEAL が使用されます。
  • そのため、ブラウザーから drupal サイトにアクセスすると、ログイン ページ (フォーム認証) にリダイレクトされ、続行するには Windows ユーザー名とパスワードを入力する必要があります。

iPad から json ファイルにアクセスしようとすると、ログイン ページへの URL を含む html コンテンツで 401 ステータスが表示されます。ヘッダーでユーザー名とパスワードを送信して基本認証を使用しようとしましたが、機能しませんでした。グーグルは有用な解決策を提供しませんでした。

誰かが同様の問題を抱えていますか?ブラウザ以外のクライアントからユーザー名とパスワードで認証する方法が必要です。

サンプル ノード js コード

var http = require('http');


var username = 'username';
var password = 'password';
var auth = "Basic " + new Buffer(username + ":" + password).toString("base64");


var options = {
  host: 'devhome.intranet.example.com',
  port: 80,
  path: '/app/api/rest/views/category.json',
  headers : {
    "Authorization" : auth
  }
};

http.get(options, function(res) {
  console.log("Got response: " + res.statusCode);
  console.log(res);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

どんな助けでも大歓迎です。

どうも

4

2 に答える 2

3

これは古い質問であることは知っていますが、非常に似たようなことをしようとしました (WebSeal の背後にある Web サービスにアクセスする .Net クライアント)。グーグルの後、有用な解決策はありません。

ただし、IBM のドキュメントから手がかりが得られました http://www.ibm.com/support/knowledgecenter/SSPREK_8.0.1.2/com.ibm.isamw.doc_8.0.1.2/wrp_config/task/tsk_submt_form_data_ws.html

基本的に、ブラウザから Webseal を介してリソースにアクセスすると、Webseal はログイン ページで応答します。ユーザー名とパスワードを入力すると、フォーム データが /pkmslogin.form に送信されます。Webseal は Cookie も返すため、後続の要求を再度認証する必要はありません。

つまり、次の POST リクエストを送信する必要があります。

POST は /pkmslogin.form に対して行う必要があります。POST リクエストの本文には、username、password、login-form-type の 3 つのフィールドのフィールド データが含まれている必要があります。

フォーム ログインの場合、login-form-type の値は「pwd」である必要があります。content-length ヘッダーは、結果のリクエスト本文の長さを示す必要があります。

HttpClientを使用して.Netでこれを行いました。このようなもの:

using (var httpClient = new HttpClient())
{
    // First post the authentication data
    var authenticationResult = httpClient.PostAsync("http://webseal/pkmslogin.form", 
        new FormUrlEncodedContent(
            new Dictionary<string, string>()
            {
                {"username", "user"},
                {"password", "pwd"},
                {"login-form-type", "pwd"}
            }
        )
    ).Result;
    // Now access our resource
    var webserviceResult = httpClient.GetAsync("http://webseal/webservice").Result;
}

それがうまくいかない場合は、WebSeal によって返される Cookie を取得し、その Cookie を毎回送信する必要がある場合があります。

于 2016-07-08T14:24:14.760 に答える