みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。FMP19.6 Windows10です。
「URLから挿入」を使ってOAuth2のaccess_tokenを取得したいのですが、うまく動作しません
指定URLに
"https://auth.xxx.net/oauth2/token"
を入れて
cURLオプションの指定で
"
-X POST
-H \"Origin: https://mydomain\"
-H \"Content-Type: application/x-www-form-urlencoded;charset=UTF-8\"
-d \"grant_type=password\"
-d \"username=@ユーティリティ::myname&password=@ユーティリティ::mypass\"
"
としていますが
{"error":"invalid_grant","error_description":"The user name or password is incorrect"}
が返ってきています。
mynameとmypassは正しく入っています
ターゲットは$$jsonとしています
アドバイス宜しくお願いします
Offline
> -d \"username=@ユーティリティ::myname&password=@ユーティリティ::mypass\"
ここの行ですが、フィールド名がそのまま文字列になっちゃってるので
-d \"username=@" & ユーティリティ::myname & "&password=@" & ユーティリティ::mypass & "\"
とかじゃないですかね。
Offline
やまほんさん、
フィールド名は"& &"の間に書くに従って
-d \"username="&@ユーティリティ::myname&"&password="&@ユーティリティ::mypass&" \"
にしてみましたが、変わらないです。テーブル名の頭に@が付いていて紛らわしいですが@ユーティリティというテーブルです。
-d \"username=\"&@ユーティリティ::myname&\"&password=\"&@ユーティリティ::mypass&\"
がいいのでは。
@ が邪魔している可能性も。
あらかじめ、変数に
"username=" & @ユーティリティ::myname & "&password=" & @ユーティリティ::mypass
を設定しておき、それをつかってみればいかがでしょう、
Offline
-d \"username=\"&@ユーティリティ::myname&\"&password=\"&@ユーティリティ::mypass&\"
がいいのでは。
@ が邪魔している可能性も。
Shinさん、
ご指南に従って修正したら
{"error":"invalid_grant","error_description":"The user name or password is incorrect"}
と出ていたエラーが消えて、HTMLが返ってきました。
ちょっと返ってきたデータが正しいのか今のところ分からないのですが、FMPで発生していた送信エラー自体は無くなって
通信ができているようです。
戻ってきているHTMLにはruntime errorが出ているのですが・・
(並行してcurlの戻り値についてendpoint元に問い合わせ中なので月曜以降にレポートします)
-d \"username=\""&@ユーティリティ::myname&"\"&password=\""&@ユーティリティ::mypass&"\"
じゃないとフィールド値が展開されないので変では?
しかし、これでも"の対応がおかしい気がしますね。usernameなどをクオートする必要あるんですか?-Hの方はスペースが入ってるので必要ですが...
データのエンコードは必要ないんでしょうか。
himadaneeさん、
試しに、下記のようにフィールド参照をしないでusernameとpassを直に入れてみると
-d \"username=MyNAME&password=MyPASS\"
元々のとは少し違う
{"error":"invalid_grant","error_description":"User is not allowed on this domain"}
が戻ります。
FMPの問題ではないのかもしれませんが、この辺りめちゃくちゃ初心者なので手探り状態です
OAuth 2.0 での access_token の取得方法は、認可サーバー依存なので、どこのサービスかが分からなければ正しい返答が得られないでしょう。
Offline
qb_dpさん、
OAuth 2.0 での access_token の取得方法は、認可サーバー依存なので、どこのサービスかが分からなければ正しい返答が得られないでしょう。
まさに今サービス元(ヨーロッパ)に問い合わせ中で回答が月曜の予定です。
因みに、取得方法自体はサービス元の指示通りです。
Content-Type: application/x-www-form-urlencoded;
という指定をしてるので、MyNAMEなどにエンコードが必要な文字が入ってるかどうかにもよりますが、
スペースだけなら%20に置換しておけば、-dの方はクオートいらない気がしますが...
https://help.claris.com/ja/pro-help/con … s.html#tn4
の下の方の例を見てください。
"--user myusername:mypassword --data fname=Bob&lname=Smith"
というふうに、--userや--dataの値はクオートしてません。してはいけないってこともないですが、、、
データ自体に"が含まれてるとどうとかややこしくなるので、値は変数に入れておくのがお勧めです。
"--user myusername:mypassword -d @$post_data"
himadaneeさん、
サービス元とのメールやり取りの中で
-d "username=USERNAME&passwrd=PASSWORD&grant_type=password"
と書きなさいと指示が来ていたので従ってはいるのですが、FMPに組み込む以前にcurlの動作が
サービス元と色々違っていたりしてトラブっているわけです。
本来この問題解決後にFMPで検証する予定でしたが、「URLから挿入」自体初めて使う機能なので
同時にやってみています。
username=USERNAME&passwrd=PASSWORD&grant_type=password
という文字列を変数に設定しておき、それを参照するのが後々らくなのでは。
Offline
Shinさん、
username=USERNAME&passwrd=PASSWORD&grant_type=password
という文字列を変数に設定しておき、それを参照するのが後々らくなのでは。
はい、私もそう思いました。修正してサービス元からの解決を待ちたいと思います
USERNAMEの方はあんまりないかもしれませんが、PASSWORDは記号を使ってるとエンコードが必要かも。(GetAsURLEncoded)
実は、ここのサービス元とのOauth2通信についてはPower Queryでうまくできています。
Power Queryの詳細エディタにはusernameやpasswordをプレーンテキストで記載していますが、それがどうエンコードされて
送られているかとかが良く分かっていません(単に知識不足ですが・・)。
FMPにデータを持ってきたり相手先を書き換えたりする必要からまずはcurlでやってみようとして躓いております
Power Queryでは
headerにOriginとContent-Typeを設定
postDataに配列[grant_type="password",timezone="Asia/Tokyo",username="USERNAME",password="PASSWORD", ]を設定し
指定したurl("https://auth.xxx.net/oauth2/token")にheaderとpostDataを送りますが、その際postDataは
Text.ToBinary(Uri.BuildQueryString(postData))
でバイナリ変換されてからurlへcontentsとして送られていることがわかりました。
これをFMP実装するとなるとpostDataをバイナリ変換するにはどうすれば良いでしょうか?
バイナリ変換は必要ないと思います。(UTF-8に自動変換)
と思ってたんですが、ヘルプ(https://help.claris.com/ja/pro-help/content/curl-options.html#tn4)を見たら
--FM-text-encoding
というオプションがありました。
「このオプションの直後に続くオプションに含まれるテキストを、FileMaker の内部文字エンコードから指定のエンコードに変換します。TextEncode 関数の encoding 引数に定義した名前のいずれかを使用します。」
これを使わないとUTF-16で送ってしまうのかな?
急にtimezoneが増えましたが、そのデータはエンコードが必要な文字を含んでます。
変数を設定で
"timezone=" & GetAsURLEncoded ( "Asia/Tokyo" )
などとやって、それを指定したらいいでしょう。
自己レスです。
サービス元から指示されたパラメータの一部(内容)に誤りがあったことがサービス元からの連絡で分かり修正したところ
コマンドラインからのcurlと「URLから挿入」両方で無事access_tokenが取得できました。
$postDataの内容は
"username=USERNAME&password=PASSWORD&grant_type=password"
という単純なものでOKでした。
Pages: 1
[ Generated in 0.010 seconds, 14 queries executed - Memory usage: 557.98 KiB (Peak: 578.89 KiB) ]