AnsweredAssumed Answered

PI Web APIのBASIC認証について

Question asked by Vorunatto on Feb 12, 2019
Latest reply on Feb 12, 2019 by Vorunatto

こんにちは。

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

以下の投稿を参照して、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)


Outcomes