WordPressのREST APIをOAuth認証で使う

ブログ

WP REST API – OAuth 1.0a Serverプラグインを使用してWordPressサイトに対するOAuth 1.0a認証をセットアップする方法について解説します。OAuth 1.0aは、クライアントアプリケーションがWordPressサイトのリソースにアクセスするための認証プロトコルで、アクセストークンを使用して安全にリソースにアクセスできます。

プラグインのインストールと設定

プラグインのインストール

  1. WordPressの管理ダッシュボードにログインします。
  2. 「プラグイン」→「新規追加」に移動します。
  3. 検索ボックスに「WP REST API – OAuth 1.0a Server」と入力し、プラグインを検索します。
  4. プラグインをインストールして有効化します。

設定の構成

  1. プラグインを有効化後、ユーザー > Applications にアクセスします。
    アプリケーション
  2. Add Newから新しくアプリケーションを追加します。
    Add
  3. ConsumeerName, description, callbackurlなどを入力します。URLはhttps://ドメイン/callback/などでOKです。
    Consumer
  4. 「Add Consumer」をクリックします。作成したクライアントの「クライアントキー」と「クライアントシークレット」が表示されます。これらの値を後で使うためにメモしておきます。
    client id

OAuth 1.0a認証フローの概要

OAuth 1.0aでは、クライアントアプリケーションがWordPressサイトのリソースにアクセスするために次の3つのステップを経る必要があります。

  1. リクエストトークンの取得: クライアントは、WordPressサーバーからリクエストトークンを取得します。
  2. ユーザー承認: リクエストトークンを使用してユーザーの承認を取得します。
  3. アクセストークンの取得: 承認されたリクエストトークンを使用して、WordPressサーバーからアクセストークンを取得します。このアクセストークンを使ってAPIにアクセスできます。

PythonからWordPress APIにアクセスする例

OAuth 1.0a認証を使って、PythonからWordPressのREST APIにアクセスするための具体的な例を紹介します。ここでは、requests-oauthlibライブラリを使用します。このライブラリはOAuth 1.0a認証をサポートしています。

まず、必要なライブラリをインストールします。

pip install requests requests-oauthlib

次に、Pythonコードを以下のように書きます。

import requests
from requests_oauthlib import OAuth1

# WordPressサイトのURLとクライアントキー、シークレット
base_url = "https://your-wordpress-site.com"
request_token_url = f"{base_url}/oauth1/request"
authorize_url = f"{base_url}/oauth1/authorize"
access_token_url = f"{base_url}/oauth1/access"
client_key = "YOUR_CLIENT_KEY"
client_secret = "YOUR_CLIENT_SECRET"

# OAuth1クライアントのセットアップ
oauth = OAuth1(client_key, client_secret=client_secret)

# 1. リクエストトークンの取得
response = requests.post(request_token_url, auth=oauth)
response_data = dict(x.split('=') for x in response.text.split('&'))
resource_owner_key = response_data['oauth_token']
resource_owner_secret = response_data['oauth_token_secret']

print(f"Request Token: {resource_owner_key}")
print(f"Request Token Secret: {resource_owner_secret}")

# 2. ユーザー承認を得るためのURLを生成
print(f"Go to the following link in your browser to authorize:")
print(f"{authorize_url}?oauth_token={resource_owner_key}")

# 3. ユーザー承認後、アクセストークンを取得
verifier = input('Paste the verifier code obtained from the browser: ')

oauth = OAuth1(
    client_key,
    client_secret=client_secret,
    resource_owner_key=resource_owner_key,
    resource_owner_secret=resource_owner_secret,
    verifier=verifier
)

# アクセストークンの取得
response = requests.post(access_token_url, auth=oauth)
access_token_data = dict(x.split('=') for x in response.text.split('&'))
access_token = access_token_data['oauth_token']
access_token_secret = access_token_data['oauth_token_secret']

print(f"Access Token: {access_token}")
print(f"Access Token Secret: {access_token_secret}")

# 4. アクセストークンを使用してWordPressに下書き記事を投稿する
post_url = f"{base_url}/wp-json/wp/v2/posts"
auth = OAuth1(client_key, client_secret, access_token, access_token_secret)

# 下書き記事の内容
post_data = {
    "title": "Sample Draft Post",
    "content": "This is a sample draft post created via OAuth 1.0a and REST API.",
    "status": "draft"  # 投稿ステータスを「draft」に設定
}

# 下書き記事の投稿
response = requests.post(post_url, auth=auth, json=post_data)

# APIレスポンスの確認
if response.status_code == 201:
    print("Draft post created successfully!")
    print("Post ID:", response.json()['id'])
else:
    print(f"Error: {response.status_code}")
    print(response.text)
  1. リクエストトークンの取得:
    requests.postを使ってリクエストトークンエンドポイントにリクエストを送信します。
    – サーバーから返されるoauth_tokenoauth_token_secretを取得します。

  2. ユーザー承認:
    – リクエストトークンを使用して、ユーザーに認証を求めるためのURLを生成します。表示されたURLをクリックすると、ログイン画面と認証画面になります。
    ログイン
    – 承認後に取得したトークンを入力します。(verifier

  3. アクセストークンの取得:
    verifierコードとリクエストトークンを使用して、アクセストークンエンドポイントにリクエストを送信し、アクセストークンとアクセストークンシークレットを取得します。

  4. APIエンドポイントへのアクセス:
    – 取得したアクセストークンを使用して、WordPressのREST APIにアクセスします。この例では、投稿の下書きをPOSTします。

実行後、投稿の下書きができていれば成功です。

まとめ

WP REST API – OAuth 1.0a Serverプラグインを使用すると、WordPressサイトに対してOAuth 1.0a認証を設定できます。OAuth 1.0aは、クライアントアプリケーションがセキュアにリソースにアクセスするための少し古めの方法ですが、OAuth2を無料で簡単に利用できる方法が見つからなかったので、OAuth1を使ってみました。

タイトルとURLをコピーしました