DRY up full URL generation

:convenience_store: 

This was being done in a few different places in an ad-hoc way, and one of those ways broke during a cookbook refactor.  This DRYs it all up in one place.
So one consideration that's lost here that was in the OmniAuth initializer, is that if `PORT` is 80 (non-ssl) or 443 (ssl), then the URL will be http://host:80 or https://host:443, which, while not wrong, is not necessary and looks weird if displayed on a page or linked to in an email or something like that.