みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
「フィールドへ挿入」で、cURLを使って、別のシステムからのAPIを利用したデータ連携を行なっていました。
今までは認証が不要だったのですが、クラウドのシステムへ以降したため、クライアント認証が必要になりました。
FielMaker 内部処理だけでは無理なんでしょうか。(--key --certification などはサポートされていませんね)
Offline
MBS プラグイン、または、BaseElement プラグイン を使って、接続することが可能になりました。
関連するスレッドが、URLから挿入でのSSL認証について にもあります。
例として、ORCA というクラウドのシステムにアクセスして、患者病名を取り出すサンプルです。
変数を設定 [ $URL ; 値: "ap-proxy.orca.orcamo.jp" ]
変数を設定 [ $PORT ; 値: "8080" ]
#
変数を設定 [ $OPTION ]
変数を設定 [ $CMD ; 値: "/api01rv2/diseasegetv2?class=01" ]
変数を設定 [ $POST ; 値: "<data> <disease_inforeq type=\"record\"> <Patient_ID type=\"string\">" & $ID & "</Patient_ID> <Base_Date type=\"string\"></Base_Date> <Select_Mode type=\"string\">All</Select_Mode> </disease_inforeq> </data>" ]
#
# Start new session
変数を設定 [ $curl ; 値: MBS ( "CURL.New" ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionURL" ; $curl ; "https://" & $URL & $CMD ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionPort" ; $curl ; $PORT ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionUsername" ; $curl ; $Username ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionPassword" ; $curl ; $Password ) ]
#
変数を設定 [ $result ; 値: MBS( "CURL.SetOptionCertInfo"; $curl; 1 ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionSSLCertType" ; $curl ; "P12" ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionSSLCert" ; $curl ; $SSLCert ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionCAINFO" ; $curl ; $CAINFO ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionKeyPassword" ; $curl ; $KeyPassword ) ]
#
If [ $POST ≠ 0 ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionHTTPHeader" ; $curl ; "Content-Type: application/xml" ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionPost" ; $curl ;1 ) ]
変数を設定 [ $result ; 値: MBS ( "CURL.SetOptionPostFields" ; $curl ; $POST ) ]
End If
#
# RUN now
フィールド設定 [ CURL Test::Result ; MBS( "CURL.Perform"; $curl ) ]
# Check result
フィールド設定 [ CURL Test::Text ; MBS( "CURL.GetResultAsText"; $curl; "UTF8" ) ]
フィールド設定 [ CURL Test::debug ; MBS( "CURL.GetDebugAsText"; $curl ) ]
フィールド設定 [ CURL Test::certinfo ; MBS( "CURL.GetCertinfo"; $curl; "UTF8" ) ]
# Cleanup
変数を設定 [ $result ; 値: MBS( "CURL.Cleanup"; $curl ) ]
Last edited by Shin (2020-04-24 08:53:48)
Offline
FIleMaker 19 で、cURL にクライアント認証のオプションが追加されているようです。
これで、内部完結です。
ヘルプにはまだ収載されていないようですのが、
[URL から挿入] スクリプトステップの新しい cURL オプション
Last edited by Shin (2020-05-28 09:52:41)
Offline
Shin様
FileMakerからORCAクラウドへの接続方法を探っていてこのスレッドに辿り着きました。
現状詰まっており、アドバイス頂けたら幸いです。
ver19から追加されたオプションでの記述なのですが、例えば患者情報取得(patientgetv2?id=)の場合、
手探りでやっているのですが、urlから挿入のオプションボックスへの直書きで、
"-X \"POST\" "
&
"-H \"Authorization:Basic " & $orcaId & ":" & $orcaPw & "\" "
&
"--cert @$sslCertificate"
&
"--pass" & $sslPw
&
"--cert-type \"P12\" "
という記述でやってみたのですが、うまくいかず、
管理機構に質問すると
認証は
--basic -u ユーザー名:APIキー (ユーザー名はオプション)
でやってくれとの返答で、
--cacert [./ca.crt]
--cert [crtファイル]
--key [pemファイル]
というオプション記述だとの返答だったのです。思っているのとかなり違う方法です。
しかし無反応でして。
--cacertはFMのcURLオプションではサポートリストに載っていないので無視されてるとは思いますが。
Offline
一見して間違いとわかるのは、オプションの間にスペースがないことです。
&でオプションの””を区切らずに1つの””の中で改行すればスペースになります。それか、忘れないように必ず先頭にスペースを入れる。
" -option value" &
~でやってくれ、といわれて、それがFMでサポートされてないオプションなら、そこのサイトは(プラグインなしでは)接続不可能といのが第一印象ですが。。。--cacertは他で代用できるものですか?
--cacert はなくても繋がるようです。また、-u が抜けているようですが。検証していませんが、文法的には
" -H Authorization:Basic " & $orcaId & ":" & $orcaPw
&
" -X POST "
&
" --cert-type P12 --cert " & $sslCertificate & " --key " & $sslPw & " & " -u " & $orcaId & ":" & $orcaPw
ではどうですか。
Last edited by Shin (2020-12-23 11:58:47)
Offline
>>himadanee様
アドバイスありがとうございます。cURLのオプション文は、デバッグできないのでいつも凡ミスに悩まされます。スペースの有無にも注意ですね。
>>Shin様
ありがとうございます。
教えて頂いた文でやってみます。とにかくトライアンドエラーを繰り返してみます。
Offline
" -H Authorization:Basic " & $orcaId & ":" & $orcaPw
&
" -X POST "
&
" --cert-type P12 --cert " & $sslCertificate & " --key " & $sslPw & " & " -u " & $orcaId & ":" & $orcaPw
でやってみたのですが、通らず、
$sslCertificateがオブジェクトフィールドに保持したファイルなので、
@$sslCertificateで以下のように最終行を変更してみても同じく「SSL証明書エラー」と出ます。
"--cert-type P12 --cert @$sslCertificate --key " & $sslPw & " -u " & $orcaId & ":" & $orcaPw
SSL証明書は間違いないなく.p12のファイルを指定しており、
https://sms.orca.orcamo.jp/rpc/api01rv2/ 以下にパラメーターを付与しております。
SSL証明書エラーはサーバーが返しているのではなく、FMから返ってきているようなのですが、、、。
プラグインの方も考慮しようかと思いますが、FM単体で完遂できればそれに越したことはないと思いまして。
Offline
$orcaId , $orcaPw は、証明書と同封されていたものですか。
また、証明書ファイルのコードは大丈夫ですか?エンコードなどしていませんか。
もう一度、
" --cert-type P12 --cert $sslCertificate --key $sslPw -u " & $orcaId & ":" & $orcaPw
だけで試していただけるとどうですか。
curl コマンドで試してみる手もありますよ。デバッグモードもありますし。
Last edited by Shin (2020-12-23 16:52:57)
Offline
ありがとうございます。
エンコードとかはやっていないんですが、、、。
Termnalからcurl試してみます。debugはverboseオプションですね。
Offline
$sslPw という変数名が気になりますが、これは「パスワード」ではなく「ファイル」を指定するオプションですよね。
ヘルプの引用
--key <$[$]FileMaker 変数>
プライベートキーファイル。この別のファイルにプライベートキーを保存できます
--cert
も、ファイルを指定するオプションなので、Shinさんの返答にあるように変数名を引数に書かないとだめです。変数値を連結したり変数名の前に@をつける書式はありません。(@をつけたりつけなかったり、オプションの統一性がないのが今一よくわかりませんが...)
文字列、ファイル指定、それぞれで試しており、混在していてすみません。
変数名の前の@ですが、ファイル指定する時は変数名の頭に@を使用するとの認識があるのですが(cURLが添付ファイルと解釈する)、ちょっと使い方が曖昧になっているかもしれません。
-d @$post_data
のような感じで一旦添付ファイルを変数に入れて、@を付与して変数と一緒に渡すと思っていたのですが、、、。
Offline
ちょっと不明瞭でしたか、
(@をつけたりつけなかったり、オプションの統一性がないのが今一よくわかりませんが...)
はFMの仕様についての発言でした。
ヘルプ参照してください。-dなどは@が必要です。同じオブジェクトフィールドの参照でも、オプションによって@が必要なのとそうでないのがあります。注の3と4です。
確か元々のcURLに@をつける書式があった気がしますが、それをFMに持ち込まれてもややこしいだけだと思うんですけど
ご指導ありがとうございます。
まだまだ認識不足ですが、とにかく出来る限りの事は全てトライしてみます。
cURLはわかってくると色々な事ができて、それがFMから利用出来るのですから素晴らしいですね。
Offline
機密データの確認が必要でしたので、フォーラム外で話していました。
"--cert-type P12 --cert $sslCertificate --key " & $sslPw & " -u " & $orcaId & ":" & $orcaPw
で接続できたそうです。このクラウドは、提供してくるクライアント情報の名前がちょっと変わっているので、オンプレミスからの移行では、取り違えが多く発生しそうです。
Offline
Shin様
こちらからの報告が遅れてすみません。
その他APIもちゃんとレスポンス取得できております。
認証以外はポストデータの組み立てだけなので、認証さえ通れば後はなんとかいけそうです。
このクラウドはまだ殆どのレスポンスがXMLで返ってくるのでJSONへの変換を間に挟みますが、FileMaker純正機能だけで完結出来て素晴らしいです。
ちなみにxml => JSONへの変換はJavaScriptのライブラリ https://github.com/nashwaan/xml-js を使わせて頂き、web viewerのJSで変換して戻しています。
これはjson => xmlも可能です。うまくパースできない場合もあるので保険で以下のスクリプトも用意させてもらっています。
https://github.com/stevenwhitespacesystems/fm-xml2json
こちらはxml => JSONのみで大きなxmlは無理ですよと断りがありますが、手軽に使えて有り難いです。
本当に助かりました。
ありがとうございます。
Offline
定型のxmlですので、テキスト処理でデータを取り出したほうが早いかもしれませんよ。
送信用も、カラのxmlを用意して必要なデータを埋め込んでいくだけで十分なような。病名のような繰り返しのモノも、ブロックごとに組み立てていけばいいのかも。(きれいな処理ではないですが)
Last edited by Shin (2021-01-14 16:18:41)
Offline
機密データの確認が必要でしたので、フォーラム外で話していました。
"--cert-type P12 --cert $sslCertificate --key " & $sslPw & " -u " & $orcaId & ":" & $orcaPw
で接続できたそうです。このクラウドは、提供してくるクライアント情報の名前がちょっと変わっているので、オンプレミスからの移行では、取り違えが多く発生しそうです。
上記cURLオプションの具体的な値($変数)を教えていただけませんか?
あと、値の変数はエスケープなしでいけましたか?
解決済みのところ申し訳ございません。ご教示願います。
例)
" --cert-type P12" &
" --cert YYYY.crt:pass" &
" --key YYYY.pem" &
" -u UNAME:apikey"
↑で皆様からアドバイスを頂いた者です。
YYYY.crt:pass ($sslCertificate)は.p12ファイルそのものを変数に格納しています。
UNAME($orcaId)はそのままorcaのID
apikey($orcaPw)はorcaのパスワードでなく、apikeyです。
" -H \"POST\" "
&
" -H \"Content-Type:text/xml; charset=utf-8\" "
&
" --cert-type P12 "
&
" --cert $cert " //p12ファイル
&
" -pass " & $sslPw & " " //sslパスワード
&
" -u " & $account & " " //orcaId:apiKey
&
" -d @$data " //リクエストとしてのxmlデータ
こんな感じです。
参考になれば幸いです。
Offline
情報ありがとうございます。
参考にしてやってみたのですが…下記のSSLエラーになってしまいます。
```
error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure
```
ちなみに
> p12ファイルそのものを変数に格納
とは、ファイルパスですよね?
あと、
--keyでpemファイルの指定はしなくてもよいのでしょうか?
もしかして、p12ファイル中身自体に問題があるのだろうか…?
ここを見てください。
https://help.claris.com/ja/pro-help/con … s.html#tn3
ファイルへのアクセスはすべて禁止されています。ファイルパスは指定できません。
ファイルを使用する場合は、変数にオブジェクトフィールドを設定して、その変数を指定します。(オブジェクトフィールド内のファイルが使われたり、結果ファイルがオブジェクトフィールドに入る)
最新のFMを使ってますか?古いバージョンはcertオプション自体サポートされてません。
ここを見てください。
https://help.claris.com/ja/pro-help/con … s.html#tn3
ファイルへのアクセスはすべて禁止されています。ファイルパスは指定できません。
ファイルを使用する場合は、変数にオブジェクトフィールドを設定して、その変数を指定します。(オブジェクトフィールド内のファイルが使われたり、結果ファイルがオブジェクトフィールドに入る)
ご回答ありがとうございます。
スクリプト成功しました。
後から読まれる方のために長時間引っかかっていた具体的な失敗例と成功例を記載しておきます。
=== × certファイルを送信する際のcURLオプション失敗例 ===
① " --cert " & $cert //$cert=p12ファイルのフルパス
② " --cert " & API::cert_p12 //$cert=p12ファイル本体を保存したフィールド
③ " --cert " & $cert //$cert=p12ファイル本体を保存したフィールド
=== ○ certファイルを送信する際のcURLオプション成功例 ===
変数を設定 [ $cert_p12 ; 値: API::cert_p12 ] //p12ファイル本体を保存したフィールドを変数に設定
① " --cert $cert” //$cert=上記のp12ファイル本体を保存したフィールドの変数を&を使わず記載する(重要!)
終わってみれば簡単な事でしたが、今までの経験上、変数($cert)の中身を使うはずと思い証明書のフルパスを設定したり、証明書そのものをフィールドに保存して設定したりし、そのフィールドや変数を&(アンパサンド)でつないでいましたが、それが仇となっていました。
まあ、私の知識不足のせいですが低レベルな質問をして申し訳ございませんでした。
上手くいきましたので報告させていただきます。ご回答いただいた皆様、ありがとうございました。
Pages: 1
[ Generated in 0.007 seconds, 11 queries executed - Memory usage: 585.69 KiB (Peak: 622.59 KiB) ]