LoginSignup
2
2

More than 5 years have passed since last update.

Docker CloudのAPI認証で"errorMessage":"UNAUTHORIZED"で怒られる

Posted at

皆様 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を読んでみた
あった!あったよ!!!ドキュメントに書いてない秘密!!

認証部分の一部抜粋
https://github.com/docker/go-dockercloud/blob/1a54bcd04d83c85c4d8cef2f5c4f6def47762b21/dockercloud/dockercloud.go#L59-L65

// 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も読もうねって強く感じた...

2
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2