JWT(Json Web Token)認証は、有効期限のあるtokenを使用せずにAPIを実行でき、またtoken取得時にシークレットキーを送信せずに済むため、BEARER認証より比較的安全です。現在CodenbergではAPI使用時にはJWT認証を推奨しています。
様々な言語用に、JWTを実行するためのライブラリが存在するので、そちらをご利用いただくか、自前でJWTを実装してください。
以下のページから取得してください。
送信していただくペイロードは以下の通りです。
## 例 { "sub": "xxxxxyyyyyyzzzzz", "iat": 12345678901234, "aud": "/test/of/url" }
HS256を使用してください。
APIキーの間違い、署名に使用したシークレットキーの間違い、アルゴリズムの間違いの他に、以下の理由で認証をエラーとしています。
httpヘッダ'Authorization'に、文字列[JWT ]に続いて作成したjwtを設定してください。
##例 header['Authorization'] = "JWT " + $created_jwt_in_hear;
実際に呼び出す弊社API(例: /templates/{template_id})のhttpヘッダに上記Authorizationを設定して通信して下さい。
# USE https://github.com/jwt/ruby-jwt # # Encoder class require 'jwt' class JwtEncoder ALG = 'HS256' def initialize(key,secret) @key = key @secret = secret end def encode(path) payload = { sub: @key, iat: Time.now.to_i, aud: path } token = JWT.encode(payload, @secret, JwtEncoder::ALG) return token end end ######################## ### code example path = "/v1/templates/#{my_template_id}" # Create Json Web Token jwtEncoder = JwtEncoder.new(my_api_key,my_api_secret) jwt = jwtEncoder.encode(path) fullPath = "https://api.codenberg.io#{path}" url = URI.parse(fullPath) request = Net::HTTP::Get.new(url.path) # Set auth header request["Authorization"] = "JWT #{jwt}" connection = Net::HTTP.new(url.host, url.port) connection.use_ssl = true connection.verify_mode = OpenSSL::SSL::VERIFY_NONE response = connection.start do |http| http.read_timeout = @readTimeOut http.request(request) end
//USE https://github.com/firebase/php-jwt use Firebase\JWT\JWT; class JwtEncoder{ const ALG = 'HS256'; private $key = null; private $secret = null; public function __construct($key,$secret){ $this->key = $key; $this->secret = $secret; } public function encode($path){ $tm = time(); $payload = array( "sub" => $this->key, "iat" => time(), "aud" => $path, ); $jwt = JWT::encode($payload, $this->secret,JwtEncoder::ALG); return $jwt; } } // Code Example // $jwtEncoder = new JwtEncoder($key, $secret); $token = $jwtEncoder->encode("/v1/templates/{$my_template_id}"); $url = "https://api.codenberg.io" . "/v1/templates/{$my_template_id}"; $curl = curl_init($url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $headers = array( "Authorization: JWT {$token}", ); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $html = curl_exec($curl);
過去に提供していたBEARER方式も引き続き提供しております。token取得時にAPIキーとシークレットキーを送信しますので、送信先のホストを間違えたりしないようご注意ください。
以下のページから取得してください。
Basic認証でトークンを取得します。Authorizationヘッダに、APIキーとシークレットキーを設定して、GETメソッドで/v1/auth/tokenにアクセスします。
# Smaple code #!/bin/sh APIKEY='xxxxx' #APIキー SECRET='yyyyy' #シークレットキー ENCODED=`echo ${APIKEY}:${SECRET} | base64` curl https://api.codenberg.io/v1/auth/token -H "Authorization: Basic ${ENCODED}"
戻り値は以下のようにJSONで返ります。
{ "token_type": "bearer", "access_token": "2f9af46b0212394aecc9a03e7190834a1ff4ffc1fb9f02e6a1c3ef3f32520664", "expires": "2019-07-17T16:46:08.724+09:00" }
AuthorizationヘッダにBEARER access_tokenを設定してAPIを呼び出します。
curl -H "Authorization: BEARER [上で取得したaccess_token]" https://api.codenberg.io/v1/xxxxx
/v1/auth/tokenは、expiresになるまで、常に同じaccess_tokenを返します。よって、複数プロセスからのAPI呼び出しは問題なく動作します。
上記の性質により、access_tokenはexpiresになるまで変更されません。よってAPI呼び出し中にexpiresになった場合、必ず認証エラーが発生します。よって全てのAPI呼び出し時について、認証エラーが発生した時のtoken再取得ロジックを必ず実装してください。
© 2016 Codenberg | Amazing Day Inc.