SalesforceからWP REST APIへOAuth認証を利用して投稿する

salesforceからWP REST APIのエンドポイントへコールアウトして投稿する。
投稿の際には、OAuth認証を利用する。

前提

WordPress側にで、OAuth 1.0a Serverを導入してアプリケーションを作成しておく。
また、そのアプリケーションを使用して、アクセストークンまで取得しているものとする。

通常は承認のフローなどはユーザー側が行うため、アクセストークンまでもった状態からスタートすることはないと思うが、今回は最後の投稿部分だけに絞って試してみた。

WP REST APIでアクセストークンを取得するには、前回書いたこの記事を参考にどうぞ。
WordPress REST APIにOAuth1.0aで認証して投稿する – KayaMemo

リモートサイトの登録

コールアウトする先のドメインを事前に許可しておいてやる必要がある。
設定 -> セキュリティのコントロール -> リモートサイトの設定 から、新規リモートサイトをクリック。

  • リモートサイト名 : 適当な名前
  • リモートさサイトのURL : 接続先ドメイン
  • プロトコルセキュリティの無効化 : HTTPでも接続を許可するか
  • 説明 : 適当な説明
  • 有効 : オンに

通常では当然だが、HTTPSでの通信が推奨されている。 しかし、リスクを承知、もしくはテストでの接続の場合など、HTTPでも接続させる場合はこの項目にチェックをつけると許可する事が可能。 今回はテストってことでオンにした。

ちなみに、このリモートサイトへの登録をせずにコールアウトしようとすると、以下のようなエラーが出力される。

Unauthorized endpoint, please check Setup->Security->Remote site settings. endpoint =xxx

OAuth1.0a認証

今回は、WP REST API + OAuth 1.0a Server の設定で投稿するため、OAuth1.0aでの認証になる。
OAuth 1.0a での認証をするためには、アクセストークンやシグネチャなどの情報をヘッダーに付与してやる必要がある。
参考: OAuth1.0の署名(Signature)を作成する方法

これらの処理をするためのクラスがあったのでこちらを参考にさせてもらった。

Apex 2-legged OAuth 1.0

ただし、このままでは足りない情報があったため、アクセストークンなどを送信するように修正させてもらったものが以下となる。

k-usk/OAuth.cls

コールアウトを実装

上記のクラスを利用して実際にコールアウトしてやる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class PostWPCallout {
    @Future(callout=true)
    public static void wpCalloutOAuth(){
      String WP_URL = 'http://example.com';
        String client_key = 'IdZQC4OG1Ppi';
        String client_secret = 'S14spr4ny50fN4mjlEfvoBl4d9dWmIyqobp60DvWAD6b0j5g';
        String oauth_token = '1IRo5QV2itt7BSeVA9m14yMQ';
        String oauth_token_secret = 'MPDAnRor5Ajxr7z1N7JF2EOr7vCZqqJE48iYjgolQ1cD0Jm9';
        
        //リクエストを作成
        HttpRequest req = new HttpRequest();
        req.setMethod('POST');
        req.setEndpoint(WP_URL + '/wp-json/wp/v2/posts'); //新規投稿
        req.setHeader('Content-Type','application/json');
        Map<String,String> mapEmp = new Map<String,String>();
        mapEmp.put('title','タイトル');
        mapEmp.put('content', '本文');
        String jsonString = JSON.serialize(mapEmp);
        req.setBody(jsonString);
        
        //クラスを利用して、OAuth用のヘッダを作る
        req = OAuth.signRequest(req, client_key, client_secret, oauth_token, oauth_token_secret);

        //コールアウト
        Http http = new Http();
        try{
            HttpResponse res = http.send(req);
            
            System.debug(Logginglevel.INFO, '*** BODY : ' + res.getBody());
            System.debug(Logginglevel.INFO, '*** STATUS : ' + res.getStatus());
            System.debug(Logginglevel.INFO, '*** STATUS_CODE : ' + res.getStatusCode());
        }catch(System.CalloutException e){
            System.debug(Logginglevel.INFO,'*** ERROR_MESSAGE : ' + e.getMessage());
            System.debug(Logginglevel.INFO,'*** ERROR_LINE_NUMBER : ' + e.getLineNumber());
        }
    }
}

コールアウトしたレスポンスがJSONで返ってくるので、投稿した記事IDを取得したい場合はここから取得したりも出来る。
(JSONでの取得はややこしいので、パースすることになるが)

   このエントリーをはてなブックマークに追加