私の目標は、サーバー側のLambda関数からPOSTリクエストを使用してユーザーコメントをWordPress APIに送信することです。 Gatsby と Netlify を使用しています。
誰かが私のGatsbyフロントエンドのコメントフォームにコメントを残すと、Netlifyは フォーム送信イベント を受け取り、 Netlify Lambda関数 が呼び出されます。 WP-REST API を使用してWordPressサイトにコメントを準備して送信するのは、この関数内です。
問題は、私の機能が静かに失敗しているように見えることです。これは、Netlifyがその機能ログを利用できるようにする方法に一部起因する可能性があります。私の直感は、POST WP APIへのコメントをRESTするためにある形式の認証が必要だったので、先に進んで JWT Authenticationをインストールしましたプラグイン (主に、基本認証よりも安全であると確信しているためですが、よくわかりません)。
JWTプラグインのドキュメントに目を通し、CORSサポートの有効化や新しい秘密鍵の定義など、_.htaccess
_ファイルと_wp-config.php
_ファイルに必要な変更を加えました。
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
Lambda関数で、postリクエストを終了JWTエンドポイントにします。
_fetch('https://example.com/wp-json/jwt-auth/v1/token', {
// credentials: 'include',
headers: new Headers({
'Authenticate': 'Basic {what do I put here?}' // Do I need "Basic"?
})
})
.then(response => {
console.log("Did we get a response? ", response)
return response.json()
})
.then(myJson => {
console.log(JSON.stringify(myJson))
})
.catch(error => {
console.log("error: ", error);
throw new Error('Something bad happened.', error)
})
_
私の混乱はhow認証呼び出しを適切にセットアップするためにif認証する必要があり、WordPress _username:password
_を送信する必要があるかどうか、またはJSON Web Token私が_wp-config.php
_で定義したもの。
そして、ユーザー名/パスワードの形式はどうあるべきですか? URLエンコードされている場合:_username=admin&password=Str0ngPass
_または単に「username:password」。
この質問 は効果的なアプローチを提供しているようですが、私はPostmanを使用しておらず、Fetch呼び出しからトークンを取得することもできません。私が見つけたいくつかのより多くの答えはより理論的であり、コード例に関してはあまり提供していません:
私は ノードのJWT Webトークン も発見しました。多分私はそれをそのように実装する必要がありますか?
Fetchを使用して認証することに関するドキュメントは、少し不規則であることがわかりました。どんな助けでも大歓迎です、そしてあなたが必要とするさらなるコード/情報を提供させていただきます。
_'Authenticate': 'Basic {what do I put here?}' // Do I need "Basic"?
_
いいえ、Basic
ではありません。 Bearer
です。ヘッダーはAuthorization
です。
したがって、最初に_/wp-json/jwt-auth/v1/token
_からトークンを取得します。
_fetch( 'http://example.com/wp-json/jwt-auth/v1/token', {
method: 'POST',
body: JSON.stringify( {
// Username of a user on the WordPress website in which the REST API request
// is being made to.
username: 'user',
// And the above user's password.
password: 'pass'
} ),
headers: {
'Content-Type': 'application/json'
}
} )
.then( res => res.json() )
.then( res => console.log( res.token ) );
_
この時点で:.then( res => console.log( res.token ) )
、たとえばブラウザーのCookie(_document.cookie
_)にトークンをキャッシュできます。つまり、エラーがない場合(REST APIエンドポイントによって返される)、トークンは_res.token
_に格納されます。
有効なトークンを取得した後、REST APIエンドポイント( "など)にリクエストを送信するときにトークンを使用できますコメントを作成します " — Authorization
ヘッダーを設定し、その値を_Bearer <token>
_に設定します。上記の例では、_<token>
_は_res.token
_の値です。
_fetch( 'http://example.com/wp-json/wp/v2/comments', {
method: 'POST',
body: JSON.stringify( {
author_email: '[email protected]',
author_name: 'Test via REST API',
content: 'Test comment',
post: 123
} ),
headers: {
'Content-Type': 'application/json',
Authorization: 'Bearer <token>'
}
} )
.then( res => res.json() )
.then( res => console.log( res ) );
_
Authorization
ヘッダーが有効になっていることを確認してくださいそのヘッダーはが pluginで必要であるためです。
そして、私の場合、Authorization
ヘッダー(PHPでは_$_SERVER['HTTP_AUTHORIZATION']
_を介してアクセスできます)が見つからないか無効になっているため、これをApacheの構成ファイルに追加する必要がありました( _httpd.conf
_):(Apacheサーバーの再起動が必要です)
_SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
_
これを(ルート)_.htaccess
_ファイルに追加しようとしましたが、うまくいきませんでした:
_RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
_
あなたや他の誰かがAuthorization
ヘッダーで問題を抱えているのに役立つことを願っています。 :)