Terminal Name Extra
We recently mentioned terminal_name_extra in our post about testing your Toopher implementation and in our quick advice about naming terminals. In this post we’ll provide a little more information as well as code snippets for each language.
What does it mean?
So, what does it mean? It’s not a double rainbow–it’s just a helpful parameter to differentiate between terminals with the same name. Terminal names are guessable: people are likely to choose phrases like “my computer” or “macbook”, so terminal_name_extra stops the bad guys from guessing your terminal name and submitting requests as you. The authenticate method does not require terminal_name_extra but we strongly suggest using it.
What should you use for the value? As with all things programming, there are a variety of options; however, an easy way to populate terminal_name_extra is to use the id of the user’s terminal.
Here’s an example terminal model in Ruby on Rails:
class ToopherTerminal
  belongs_to :user
  field :id, type: String
  field :cookie_value, type: String
  field :display_name, type: String
end
Here, a user has many terminals that posess an id (assigned by the database), cookie_value (whatever value is in the Toopher cookie), and display_name (the user-entered description). Using this scheme you would lookup the terminal by the cookie_value and input id as the terminal_name_extra parameter in your authenticate call. Here’s some sample code using the above Rails model.
terminal = user.toopher_terminals.where(cookie_value: cookies[:toopher_terminal]).first
auth = toopher.authenticate(user.toopher_pairing_id, terminal.display_name, 
                            'login', { terminal_name_extra: terminal.id })
How does it work in my language?
Below is the current function defintion and an example usage for each language library.
PHP
PHP library. The authenticate function for version 1.0.0:
public function authenticate($pairingId, $terminalName, $actionName = '', $extras = array())
Example usage:
$auth = $toopher->authenticate($pairingId, $terminalName, 
                               $actionName, array("terminal_name_extra" => $terminalExtra));
Ruby
Ruby library. The authenticate function definition for version 1.0.5:
def authenticate(pairing_id, terminal_name = '', action_name = '', options = {})
Example usage:
auth = toopher.authenticate(user.toopher_pairing_id, terminal.display_name, 
                            action, { terminal_name_extra: terminal._id })
Python
Python library. The authenticate function definition for version 1.0.4:
def authenticate(self, pairing_id, terminal_name, action_name=None, **kwargs):
Example usage:
auth = toopher.authenticate(pairing_id, terminal_name, 
                            action, terminal_name_extra=terminal_extra)
Java
Java library. The authenticate function definition for version 1.0.0:
public AuthenticationStatus authenticate(String pairingId, String terminalName,
                                         String actionName, Map<String, String> extras) 
Example usage:
Map<String, String> extras = new HashMap<String, String>() { 
  { put("terminal_name_extra", terminalNameExtra); } };
AuthenticationStatus auth = toopher.authenticate(pairingId, terminalName, action, extras);
.NET (dotnet)
.NET library. The Authenticate function definition for version 1.0.0:
public AuthenticationStatus Authenticate (string pairingId, string terminalName, 
                                          string actionName = null, 
                                          Dictionary<string, string> extras = null)
Example usage:
var extras = new Dictionary<string, string> { { "terminal_name_extra", terminalNameExtra } };
var auth = toopher.Authenticate (pairingId, terminalName, actionName, extras);
So, now that you know a bit about terminal_name_extra, we hope you’ll use it in every Toopher implementation. If you run into any problems, just let us know.