🌟

iiif auth apiを試す

2022/11/18に公開約6,900字

概要

iiif auth apiを試すため環境として、以下のリポジトリが提供されています。

https://github.com/digirati-co-uk/iiif-auth-server

今回は、上記のリポジトリを使用して、iiif auth apiを試します。

起動

準備

git clone https://github.com/digirati-co-uk/iiif-auth-server
cd iiif-auth-server
python -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt 

pip install -r requirements.txt時にバージョンの不具合などが発生した場合、以下のように、バージョン情報を削除して、再度試すなどしてみてください。

requirements.txt
argparse
Flask
iiif2
itsdangerous
Jinja2
MarkupSafe
pbr
Pillow
six
stevedore
Werkzeug

db作成

その後、dbを作成します。

export FLASK_APP=iiifauth
export FLASK_DEBUG=true
flask initdb

上記を実行後、iiif-auth-server/iiifauthiiifauth.dbというファイルが作成されます。

dbの中身は、以下のようなツールを使って確認することができます。

https://sqlitebrowser.org/dl/

起動

以下を実行します。

flask run

その後、http://127.0.0.1:5000にアクセスすると、以下の画面が表示されます。

ビューアの準備

以下を実行して、mirador3をダウンロードして、ローカルサーバで起動してみます。

wget https://mirador.cultural.jp
python -m http.server

http://0.0.0.0:8000にアクセスして、以下の画面が表示されればOKです。

ビューアに読み込ませる

http://127.0.0.1:5000のページの構成は、まずImagesが並び、その後Manifestsが並びます。

今回、下部のManifestsを、Mirador3で読み込んでみます。

わかりやすい例として、02のdegradedを試してみます。

以下のようなURLにアクセスしてみます。

http://0.0.0.0:8000/?manifest=http://0.0.0.0:5000/manifest/02_degraded

すると、以下のように表示されます。特徴として、画面上部にログインのための帯が表示され、色がついていない画像が表示されます。

そこで、ログインをしてみます。以下のようなログイン画面が起動するため、Loginボタンを押します。

そうすると、以下のように、画面上部がLog outボタンに変わり、カラーの画像が表示されます。

上記が、iiif auth apiの利用例のひとつです。

以下、小さくて見にくいと思いますが、先に紹介したDB Browser for SQLiteでiiifauth.dbを開いて表示したものです。session_idtokenなどが保存されていることが確認できます。

info.jsonを概観する

上記の例のinfo.jsonは以下です。

serviceの箇所に記載された文字列が、ビューア上で表示されていたことが確認できます。

info.json
{
  "@context": "http://iiif.io/api/image/2/context.json",
  "@id": "http://0.0.0.0:5000/img/02_gauguin_degraded.jpg",
  "height": 2506,
  "profile": [
    "http://iiif.io/api/image/2/level2.json"
  ],
  "protocol": "http://iiif.io/api/image",
  "service": {
    "@context": "http://iiif.io/api/auth/1/context.json",
    "@id": "http://0.0.0.0:5000/auth/cookie/login/02_gauguin.jpg",
    "confirmLabel": "Login",
    "description": "Example Institution requires that you log in with your example account to view the full-quality content.",
    "failureDescription": "You don't appear to have access to the full colour version. <a href=\"http://example.org/policy\">Access Policy</a>",
    "failureHeader": "Viewing greyscale version",
    "header": "Please Log In",
    "label": "Login to Example Institution for full quality",
    "profile": "http://iiif.io/api/auth/1/login",
    "service": [
      {
        "@id": "http://0.0.0.0:5000/auth/token/login/02_gauguin.jpg",
        "profile": "http://iiif.io/api/auth/1/token"
      },
      {
        "@id": "http://0.0.0.0:5000/auth/logout/login/02_gauguin.jpg",
        "label": "log out",
        "profile": "http://iiif.io/api/auth/1/logout"
      }
    ]
  },
  "tiles": [
    {
      "scaleFactors": [
        1,
        2,
        4,
        8,
        16
      ],
      "width": 256
    }
  ],
  "width": 3176
}

さらに、service > service のところで、以下のような記載があります。ここで、ログアウト時などに必要な情報が記載されています。

"service": [
      {
        "@id": "http://0.0.0.0:5000/auth/token/login/02_gauguin.jpg",
        "profile": "http://iiif.io/api/auth/1/token"
      },
      {
        "@id": "http://0.0.0.0:5000/auth/logout/login/02_gauguin.jpg",
        "label": "log out",
        "profile": "http://iiif.io/api/auth/1/logout"
      }
    ]

これまで、以下のようなURLが登場しています。

上記の処理内容については、iiifauth/iiif_auth_server.pyに記載されています。

例えばログアウトについては、以下のようになっており、tokensテーブルから当該レコードを削除していることが確認できます。

iiifauth/iiif_auth_server.py
@app.route('/auth/logout/<pattern>/<identifier>')
def logout_service(pattern, identifier):
    """Log out service"""
    service_id = get_service_id(pattern, identifier)
    session.pop('service_id')
    database = get_db()
    database.execute('delete from tokens where session_id=? and service_id=?',
                     [get_session_id(), service_id])
    database.commit()
    return "You are now logged out"

上記のような箇所を参考にして、各機関の環境に応じた実装を行うのがよいように思います。

なお、ログインが成功・失敗時の個々の処理内容は、以下に記載されていました。

iiifauth/media/policy.json
{
    "comment" : "This is neither IIIF nor JSON-LD, even though it contains fragments of IIIF. Its purpose is configuration the demo",
    "01_Icarus_Breughel.jpg" : {   
        "label": "Standard login",     
        "auth_services" : [
            {
                "profile": "http://iiif.io/api/auth/1/login",
                "label": "Login to Example Institution",
                "header": "Please Log In",
                "description": "Example Institution requires that you log in with your example account to view this content.",
                "confirmLabel": "Login",
                "failureHeader": "Authentication Failed",
                "failureDescription": "<a href=\"http://example.org/policy\">Access Policy</a>"
            }
        ]
    },
    "02_gauguin.jpg" : {
        "label": "Login with degraded access for unauthed users",
        "auth_services" : [
            {
                "profile": "http://iiif.io/api/auth/1/login",
                "label": "Login to Example Institution for full quality",
                "header": "Please Log In",
                "description": "Example Institution requires that you log in with your example account to view the full-quality content.",
                "confirmLabel": "Login",
                "failureHeader": "Viewing greyscale version",
                "failureDescription": "You don't appear to have access to the full colour version. <a href=\"http://example.org/policy\">Access Policy</a>"
            }
        ],
        "degraded": "02_gauguin_degraded.jpg"
    },
    "02_gauguin_degraded.jpg" : {
        "label": "The degraded (open) form of the above",
        "open" : true,
        "degraded_for": "02_gauguin.jpg"
    },
    ...
]

さまざまな処理が可能なはずですので、上記ファイルと以下を参考に、色々と試してみるのがよさそうです。

https://iiifauth.digtest.co.uk/

まとめ

国内では島根大学などを除いて、あまり導入例を見ないiiif auth apiですが、本記事が参考になりましたら幸いです。

https://current.ndl.go.jp/ca1988

具体的な実装方法などについても、今後調査してみたいと思います。

Discussion

ログインするとコメントできます