PI Web APIのBASIC認証について

こんにちは。

初歩的な質問になりすいません。

以下の投稿を参照して、PI Web APIを用いてデータを収集するプログラムを作成しようとしております。

 

PI Web APIの使い方(基礎)

PI Web APIのクエリ作成の演習

PythonにてPI Web APIからデータを収集の例 - GET

 

Postmanであれば、以下のURLを設定してJSON形式のデータが取得できているのですが、

上記のpythonのサンプルコードを用いると"Message": "Authorization has been denied for this request."が表示されデータが取得できません。

https://localhost/piwebapi/assetservers/

 

Postmanでは、Authorizationを「No Auth」でGETを実行すればデータを取得できますが、

「Basic Auth」でユーザー/パスワードを入力すると、"Message": "Authorization has been denied for this request."が表示されます。

 

恐らく、ユーザー認証がうまくいっていないためだと思うのですが、

どのユーザーIDとパスワードを設定すれば、認証がうまくいくのでしょうか?

また、PI SystemからユーザーIDとパスワードを確認するにはどのように確認すれば良いでしょうか?

piadminでも接続がうまくいくならいいのですが、パスワードが間違っているのかうまくいかず・・・。

ご回答よろしくお願い致します。

 

サンプルプログラムを下記に記載しました。

 

# Python Web API GET sample
import json
import getpass

import requests
# sys.path.append('C:\Python37-32\Lib\site-packages')
# PI Web APIのリクエストはHTTPSが必要ですが、
# テストの環境では、PI Web APIのサーバーに自己署名証明書しかないことが多いです。
# この場合、HTTPSのリクエストをするとrequestsのパッケージか警告またはエラーが発生します。
# 下記の行は警告を無視するためです。
requests.packages.urllib3.disable_warnings()

base_url = 'https://localhost/piwebapi/'

url = base_url

# PI Web APIにて認証は三種類ありますが、このポストではKerberosについては言及しません。
# Basic認識を使う場合はユーザー名とパスワードを送る必要があります。
# Anonymousを使う場合は下記のように空白でよいです。
user = 'piadmin'
_password = ''

def password():
 global _password
 if _password == '':
 _password = getpass.getpass('please type in your password: ')
 return _password

def pi_get_requests(action, parameters={}, debug=True):
 # pi_get_requestsの関数は変数として:
 # actionにelement、assetdatabasessetなどのController(Method)名か
 # controler名/webidのリソース名
 # parametersに"Url Parameters"を設定する

 # verify=Falseのパラメーターは自己署名証明書しかない環境では
 # エラーを発生させないためのパラメーターです。
 response = requests.get(url=base_url + action,
 params=parameters,
 verify=False,
 auth=(user, password()))
 # エラーが発生すると、レスポンスのヘッダーなどを見て何かあったと分かるケースが多いので、
 # pi_get_requests(action, parameters={}, debug=True)と実行するとレスポンスの情報を出力します。
 if debug:
 # レスポンスなどを出力する
 print('デバッグのための情報です')
 print('{0: <10} {1}'.format('url:', response.url))
 print('{0: <10} {1}'.format('status:', response.status_code))
 print('{0: <10} {1}'.format('reason: ', response.reason))
 print('{0: <10} '.format('headers:'))
 for key in response.headers:
 print(' {0: <17} {1}'.format(key + ':', response.headers[key]))
 # 
 # print('{0: <10} {1}'.format('text:'), response.text)
 return json.loads(response.text)


def pprint(response):
 # pi_get_requestsを綺麗に出力するため
 print(json.dumps(response, indent=4, sort_keys=True))

allServers = pi_get_requests('assetservers/')
pprint(allServers)


Parents
  • PI WebAPIがデフォルトであるKerberos認証以外を使うようにAFのConfiguration Databaseにて設定変更を行う必要があるかと思われます。

    英語にはなりますがこちらの投稿をご参照ください。

    Basic Authentication - PI WebAPI - "Authorization has been denied for this request."

    PI WebAPIマニュアルの該当ページへのリンク→ PI Web API

     

    IE、Chrome等のブラウザーからでもデータの取得ができるかご確認ください。

  • ご回答ありがとうございます。

    お教え頂いた投稿を参考にAFのAuthenticationMethodsのValueを「Kerberos」から「Basic」に変えたところ、

    データを取得することができました。

Reply Children
No Data