diff --git a/README.md b/README.md index 662e4f9..8f558eb 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,9 @@ gem install mapbox-sdk * Profiles for driving, driving-traffic, walking, and cycling * [Optimization](https://docs.mapbox.com/api/navigation/#optimization): [[docs](https://github.com/mapbox/mapbox-sdk-rb/blob/master/docs/optimization.md)] * Profiles for driving, driving-traffic, walking, and cycling +* [Tokens](https://docs.mapbox.com/api/accounts/#tokens) [[docs](https://github.com/mapbox/mapbox-sdk-rb/blob/master/docs/tokens.md)] + * Get, create, update, and delete + * Get scopes ## Testing diff --git a/docs/tokens.md b/docs/tokens.md new file mode 100644 index 0000000..e5fa2e3 --- /dev/null +++ b/docs/tokens.md @@ -0,0 +1,45 @@ +# Tokens + +```rb +require "mapbox-sdk" +Mapbox.access_token = "YOUR_ACCESS_TOKEN" + +# Get token +token = Mapbox::Tokens.get_token + +# List token's scopes +scopes = Mapbox::Tokens.list_scopes("YOUR_USERNAME") + +# List all tokens (your token must have the 'tokens:read' scope) +tokens = Mapbox::Tokens.list_tokens("YOUR_USERNAME") + +# List only default public token +default_token = Mapbox::Tokens.list_tokens("YOUR_USERNAME", {:default => true}) + +# List tokens except default public token +tokens = Mapbox::Tokens.list_tokens("YOUR_USERNAME", {:default => false}) + +# List public tokens +public_tokens = Mapbox::Tokens.list_tokens("YOUR_USERNAME", {:usage => 'pk'}) + +# List secret tokens +secret_tokens = Mapbox::Tokens.list_tokens("YOUR_USERNAME", {:usage => 'sk'}) + +# Create a public token (your existing token must have the 'tokens:read' & 'tokens:write' scopes in addition to any scopes you intend to set on your new token) +public_token = Mapbox::Tokens.create_token("YOUR_USERNAME", "auto-generated public token", ["styles:tiles", "styles:read", "fonts:read", "datasets:read", "vision:read"]) + +# Create a public token with use restricted to a particular domain name +public_token = Mapbox::Tokens.create_token("YOUR_USERNAME", "auto-generated public token", ["styles:tiles", "styles:read", "fonts:read", "datasets:read", "vision:read"], ["example.com"]) + +# Create a secret token (your existing token must have the 'tokens:read' & 'tokens:write' scopes in addition to any scopes you intend to set on your new token) +public_token = Mapbox::Tokens.create_token("YOUR_USERNAME", "auto-generated secret token", ["scopes:list", "tokens:read", "tokens:write"]) + +# Delete a token +Mapbox::Tokens.delete_token("YOUR_USERNAME", "TOKEN_ID") + +# Update a public token's name/note & scopes (no "vision:read" scope) +updated_token = Mapbox::Tokens.update_token("YOUR_USERNAME", "TOKEN_ID", "updated token", ["styles:tiles", "styles:read", "fonts:read", "datasets:read"]) + +# Update a public token's name/note, scopes, and allowed URLs +updated_token = Mapbox::Tokens.update_token("YOUR_USERNAME", "TOKEN_ID", "updated token", ["styles:tiles", "styles:read", "fonts:read", "datasets:read"], ["example.com"]) +``` \ No newline at end of file diff --git a/lib/mapbox.rb b/lib/mapbox.rb index fe17db0..5858379 100644 --- a/lib/mapbox.rb +++ b/lib/mapbox.rb @@ -17,6 +17,7 @@ class << self def self.request(method, url, api_key, params={}, headers={}, api_base_url=nil) api_base_url = api_base_url || @api_base params = params || {} + headers = headers || {} unless access_token ||= @access_token raise AuthenticationError.new('No API key provided. ' \ @@ -28,13 +29,19 @@ def self.request(method, url, api_key, params={}, headers={}, api_base_url=nil) url = api_base_url + url - params['access_token'] = access_token - case method.to_s.downcase.to_sym when :get, :head, :delete + params['access_token'] = access_token + # Make params into GET parameters url += "#{URI.parse(url).query ? '&' : '?'}#{uri_encode(params)}" if params && params.any? payload = nil + else + url += "#{URI.parse(url).query ? '&' : '?'}#{uri_encode({'access_token' => access_token})}" + payload = params.to_json + headers.update( + :content_type => :json, + :accept => :json) end @request_opts = {:verify_ssl => OpenSSL::SSL::VERIFY_PEER, @@ -45,7 +52,8 @@ def self.request(method, url, api_key, params={}, headers={}, api_base_url=nil) :open_timeout => 30, :payload => payload, :url => url, - :timeout => 80) + :timeout => 80, + :headers => headers) begin response = execute_request(@request_opts) @@ -91,7 +99,7 @@ def self.parse(response) # some library out there that makes symbolize_names not work. response = JSON.parse(response.body) rescue JSON::ParserError - raise general_api_error(response.code, response.body) + raise general_api_error(response.code, response.body) unless response.body.empty? && (response.code >= 200) && (response.code < 300) end response @@ -184,4 +192,5 @@ def xy_from_hash h = {} require 'mapbox/isochrone' require 'mapbox/matrix' require 'mapbox/map_matching' -require 'mapbox/optimization' \ No newline at end of file +require 'mapbox/optimization' +require 'mapbox/tokens' \ No newline at end of file diff --git a/lib/mapbox/tokens.rb b/lib/mapbox/tokens.rb new file mode 100644 index 0000000..5eb1f61 --- /dev/null +++ b/lib/mapbox/tokens.rb @@ -0,0 +1,72 @@ +require 'rest-client' +require 'json' +require 'uri' + +module Mapbox + class Tokens + include Mapbox::APIOperations::Request + extend Mapbox::HashUtils + + def self.assemble_params(options={}) + params = '' + if options.length > 0 + params += "#{params.length > 0 ? '&' : '?'}#{URI.encode_www_form(options)}" + end + + return params + end + + def self.list_tokens(username, options={}) + params = self.assemble_params(options) + + return request( + :get, + "/tokens/v2/#{URI.escape(username)}#{params}", + nil) + end + + def self.get_token() + return request( + :get, + "/tokens/v2/", + nil) + end + + def self.create_token(username, note, scopes, allowedUrls=[]) + scopes = scopes || [] + + params = {'note' => note, 'scopes' => scopes} + params.update('allowedUrls' => allowedUrls) if allowedUrls && allowedUrls.any? + + return request( + :post, + "/tokens/v2/#{URI.escape(username)}", + params) + end + + def self.delete_token(username, token_id) + return request( + :delete, + "/tokens/v2/#{URI.escape(username)}/#{URI.escape(token_id)}") + end + + def self.update_token(username, token_id, note, scopes, allowedUrls=[]) + scopes = scopes || [] + + params = {'note' => note, 'scopes' => scopes} + params.update('allowedUrls' => allowedUrls) if allowedUrls && allowedUrls.any? + + return request( + :patch, + "/tokens/v2/#{URI.escape(username)}/#{URI.escape(token_id)}", + params) + end + + def self.list_scopes(username) + return request( + :get, + "/scopes/v1/#{URI.escape(username)}", + nil) + end + end +end \ No newline at end of file diff --git a/test/tokens_test.rb b/test/tokens_test.rb new file mode 100644 index 0000000..8129897 --- /dev/null +++ b/test/tokens_test.rb @@ -0,0 +1,118 @@ +require 'mapbox' +require 'test/unit' +require 'mocha/setup' +require 'shoulda' + +module Mapbox + class TokensTest < Test::Unit::TestCase + should "#tokens_list" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_tokens(ENV["MapboxUsername"]) + assert result + end + + should "#tokens_list (include true default param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_tokens(ENV["MapboxUsername"], {:default => true}) + assert result + assert Mapbox.request_opts[:url].include? '?default=true' + end + + should "#tokens_list (include false default param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_tokens(ENV["MapboxUsername"], {:default => false}) + assert result + assert Mapbox.request_opts[:url].include? '?default=false' + end + + should "#tokens_list (include public key usage param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_tokens(ENV["MapboxUsername"], {:usage => "pk"}) + assert result + assert Mapbox.request_opts[:url].include? '?usage=pk' + end + + should "#tokens_list (include private key usage param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_tokens(ENV["MapboxUsername"], {:usage => "sk"}) + assert result + assert Mapbox.request_opts[:url].include? '?usage=sk' + end + + should "#token_get" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.get_token + assert result + end + + should "#token_create" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", []) + assert result + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_create (include note param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", []) + assert result + assert Mapbox.request_opts[:payload].include? '"note":"mapbox-sdk-rb test"' + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_create (include scopes param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", ["tokens:read"]) + assert result + assert Mapbox.request_opts[:payload].include? '"scopes":["tokens:read"' + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_create (include allowed URLs param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", [], ["example.com"]) + assert result + assert Mapbox.request_opts[:payload].include? '"allowedUrls":["example.com"' + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_delete" do + Mapbox.access_token = ENV["MapboxAccessToken"] + new_token = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", []) + result = Mapbox::Tokens.delete_token(ENV["MapboxUsername"], new_token.first["id"]) + assert result + end + + should "#token_update" do + Mapbox.access_token = ENV["MapboxAccessToken"] + new_token = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", []) + result = Mapbox::Tokens.update_token(ENV["MapboxUsername"], new_token.first["id"],"mapbox-sdk-rb test (updated)",[]) + assert result + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_update (include scopes param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + new_token = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", ["tokens:read"]) + result = Mapbox::Tokens.update_token(ENV["MapboxUsername"], new_token.first["id"],"mapbox-sdk-rb test (updated)",["tokens:write"]) + assert result + assert Mapbox.request_opts[:payload].include? '"scopes":["tokens:write"' + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#token_update (include allowed URLs param)" do + Mapbox.access_token = ENV["MapboxAccessToken"] + new_token = Mapbox::Tokens.create_token(ENV["MapboxUsername"], "mapbox-sdk-rb test", []) + result = Mapbox::Tokens.update_token(ENV["MapboxUsername"], new_token.first["id"],"mapbox-sdk-rb test (updated)",[], ["example.com"]) + assert result + assert Mapbox.request_opts[:payload].include? '"allowedUrls":["example.com"' + Mapbox::Tokens.delete_token(ENV["MapboxUsername"], result.first["id"]) if result + end + + should "#scopes_list" do + Mapbox.access_token = ENV["MapboxAccessToken"] + result = Mapbox::Tokens.list_scopes(ENV["MapboxUsername"]) + assert result + end + end +end \ No newline at end of file