皆様 docker cloud活用してますか?
個人的にはtutumの時から愛用しており、ちょっとしたものをdeployするのに
本当に重宝しております。
んで、そろそろAPI経由で操作したくなってドキュメントを読んでみた
ふむふむ、なるほど認証はhttp headerに
Authorization: Basic ${API_KEY}
この形で書いてやればいいわけね OKOK 楽勝
はい、これが大きな勘違い
通らない、全然通らない
無慈悲なレスポンス
{"type":"error","data":{"errorMessage":"UNAUTHORIZED"}}
あれー?API key生成ミスったかな?コピペミスったかな?で、
もう一回、全然通らない。
なんかオフィシャルサイトで生成されたAPI keyとsampleが送ってるAPI keyと形式が違うし
にっちもさっちもいかないのでとりあえずオフィシャルで用意されてるgolangのclient sourceを読んでみた
あった!あったよ!!!ドキュメントに書いてない秘密!!
// Load environment variables as an alternative option
if os.Getenv("DOCKERCLOUD_USER") != "" && os.Getenv("DOCKERCLOUD_APIKEY") != "" {
User = os.Getenv("DOCKERCLOUD_USER")
ApiKey = os.Getenv("DOCKERCLOUD_APIKEY")
sEnc := base64.StdEncoding.EncodeToString([]byte(User + ":" + ApiKey))
AuthHeader = fmt.Sprintf("Basic %s", sEnc)
return nil
}
解決
${user}:${api_key}
の形でbase64 encodingした値を渡さないとだめじゃん!!!
そんなことどこにも書いてねーじゃねーか クソぁ!!
自分はruby使って書いてたのでこんな感じになった
require 'base64'
# documentに書いてないが"user:apikey"の形式でbase64 encodingした値を利用する!!!
def authorization
enc_src = "#{ENV['DOCKERCLOUD_USER']}:#{ENV['DOCKERCLOUD_APIKEY']}"
@auth ||= "Basic #{Base64.strict_encode64( enc_src)}"
end
headers = {
Authorization: authorization,
}
# http request...
動いた
困ったらドキュメントだけじゃなくてsourceも読もうねって強く感じた...