私のユーザー名はuser1
パスワードですmypass8@
このユーザー名とパスワードをカールコマンドに渡したいと思います。
@
パスワードをカールコマンドに渡すときにパスワードをエスケープする方法は?
curl -k -X POST https://user1:mypass8@@myshop.com/job/build
エラーメッセージが表示されます。
メッセージ:user1のパスワード/トークンが正しくありません。
私も次のことを試しましたが、すべて失敗しました。パスワードに文字が正しくなく、2
コマンドがパスワードで考慮されていませんcurl
。
curl -k -X POST https://'user1:mypass8@'@myshop.com/job/build
curl -k -X POST https://"user1:mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:"mypass8@"@myshop.com/job/build
curl -k -X POST https://user1:'mypass8@'@myshop.com/job/build
更新:私が試しているログインはJenkins Management Consoleです。
何か提案してもらえますか?
答え1
URLの使い方パーセントエンコーディングURLエンコーディングとも呼ばれます。
@
%40
このエンコーディングのシンボル。
% curl -k -X POST https://user1:mypass8%[email protected]/job/build
または-u
/--user
パラメータを使用してください。
% curl -u user1:mypass8@ -k -X POST https://myshop.com/job/build
userinfoサブコンポーネントは、ユーザー名とリソースにアクセスするための権限を取得する方法に関するオプションのシナリオ固有の情報で構成できます。ユーザー情報(存在する場合)の後には、
@
ホストと区別するビジネスシンボル( "")が続きます。
userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
user:password
""フォーマットはuserinfoフィールドでは廃止されました。アプリケーションは、コロンの後のデータが空の文字列(パスワードなしを示す)でない限り、UserInformationサブコンポーネントの最初のコロン( ":")文字の後のデータをプレーンテキストとしてレンダリングしないでください。アプリケーションは、参照の一部として受信したデータを無視または拒否することを選択でき、そのデータを暗号化されていない形式で保存することを拒否する必要があります。テキストで認証情報を渡すことは、ほとんどすべてのユースケースでセキュリティ上のリスクがあることが証明されています。
可能であれば、ユーザーフィードバックのためにURIを提供するアプリケーション(グラフィックスハイパーテキストブラウジングなど)は、残りのURIとは区別されるようにユーザー情報を表示する必要があります。このプレゼンテーションは、情報が信頼できるドメイン名のように見えるように誤解を招く状況でユーザーをサポートします(セクション7.6)。
この小さなGoアプリケーションでテストしました。
package main
import (
"log"
"net/http"
)
func auth(fn http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
user, pass, _ := r.BasicAuth()
if !check(user, pass) {
http.Error(w, `Unauthorized.`, 401)
return
}
fn(w, r)
}
}
func check(user string, pass string) bool {
if user == `user` && pass == `pass@` {
return true
}
return false
}
func index(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte(`hello, world!`))
}
func main() {
http.HandleFunc("/", auth(index))
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
サーバーを実行します。
% go run .
テスト:
% curl -k -X POST http://user:pass%[email protected]:8080/
hello, world!
% curl -k -X POST http://user:[email protected]:8080/
Unauthorized.
% curl --version
curl 7.72.0 (x86_64-pc-linux-gnu) libcurl/7.72.0 OpenSSL/1.1.1g zlib/1.2.11 zstd/1.4.5 libidn2/2.3.0 libpsl/0.21.1 (+libidn2/2.3.0) libssh2/1.9.0 nghttp2/1.41.0
Release-Date: 2020-08-19
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
答え2
Base64変換を使用して問題を解決しました。
echo -n '[USERNAME]:[PASSWORD]' | base64
これにより、次のようにカールするためのヘッダーに渡されるトークンが生成されます。
curl -H 'Authorization: Basic [add value obtained from the previous cmd]'
答え3
正常にURLエンコードが完了しました@
。問題は、ユーザー名、パスワードをホストとして扱うと言うときに間違っていることです。http://myuser:myp@[email protected]/file
myuser
myp
[email protected]
したがって、次のことを行うと:
user="myuser"
pass="$( printf 'myp@ssword' | sed 's/@/%40/g' )"
curl "https://${user}:${pass}@host.example.com/file"
あなたはより良い幸運を持っている必要があります。
答え4
動作しない:
curl -u user1:mypass8@ -k -X POST https://myshop.com/job/build
布材:
curl -u 'user1:mypass8@' -k -X POST https://myshop.com/job/build
これアポストロフィパスワードに@が含まれている場合は「」が必須です。