How do i map domain name to userid when request comes in?
Obviously, you'll have to store that information somewhere, most likely in a database.
Add a database table domains
with columns:
- customerId
- name
- active (1 or NULL)
- challenge
Add unique key for (name, active) to ensure a domain name is mapped only once.
When a customer attempts to add a domain, add a row with active=NULL and challenge set to a random string.
Show the random string to the customer and ask them to put up a web page with it on the site or create a dummy DNS record with it to verify domain ownership (this is how Google Apps do it).
You could verify ownership by sending an email to the administrative contact or in some other way.
When the customer says he did what you instructed them to do in step #2, verify it and set active=1, challenge=NULL.
If the domain was previously active for some other customer, delete those records or set active=0.
Ask the customer to add a CNAME record for their domain and forward it to your domain, e.g. hosted.myservice.com
(Google uses ghs.google.com
for Google Apps).
When a request comes in, do
SELECT customerId FROM domains WHERE name=:requestDomain AND active=1
A better way may be to automatically offer your customers a domain in the format of <customername>.myservice.com
, in addition to custom domains. This gives you two benefits:
Customers who don't wan't to use their own domain can still customize their login page, e.g. with a company logo.
For custom domains, you can ask your customer to forward them to <customername>.myservice.com
instead of to a generic hosted.myservice.com
.
This enables you to horizontally partition customers among multiple servers without having to ask customers to change anything on their end. For example, you could give customers an option to choose whether they want their account hosted in EU or US. When they change it, just transfer their data and update <customername>.myservice.com
. Their custom domain will work automatically.
To do this, you'd have to set up a wildcard DNS record for *.myservice.com
(unless you also need the latter feature, in which case you'll have to manage individual records).