概要
最近のWebサービスの新規会員登録画面には「Googleアカウントで会員登録する」ボタンが付いていることがよくあると思います。
それに関連して、例えば『フォームに入力されたメールアドレスがGoogleアカウントに対応していたら「Googleアカウントで会員登録する」ボタンを会員登録画面に表示させたい』といったニーズがたまにあります。
フォーム入力されたメールアドレスが「someone@gmail.com」などgmail.comドメインのメールアドレスであれば、その人は「Googleで会員登録する」が使えると言うことがプログラム的に判定できます。
しかし、Google Apps for Workを使っていると、独自ドメインのメールアドレスの裏側にGMailが居たりするので、単純にメールアドレスのドメイン部分だけを見ただけでは、その人に対して「Googleで会員登録する」機能が利用できるかどうかをプログラム的には判定できません。
なんとかして、入力されたメールアドレスでGoogle Appsが使われているかを判定する方法がありましたので以下に記述します。
判定方法
判定方法として2つの方法があります。1つめの方法は確実ですが、2つめの方法は判定が上手くいかないケースがあります。
方法1
下記URLに対して、curlなどでリクエストを投げます。
https://www.google.com/a/{domain}/ServiceLogin?hl=ja
※{domain}部分はメールアドレスのドメイン名部分に置き換える
{domain}
でGoogle Appsを利用していない場合、上記URLのレスポンスには必ず「Google Apps を使用していないドメインのログイン ページにアクセスしました。」という文言が含まれます。なので、その文言が入っていなければ、そのメールアドレスはGoogle Appsを使って運用されている、ということが分かります。
この検出方法の元ネタはStack Overflowにあります。
Programmatically assessing if a domain has Google Apps or not
方法2
メールアドレスのドメインのMXレコードを引き、MXレコードに「aspmx.l.google.com」などGoogle Appsのサーバーが入っているかどうかを調べるという方法です。
一般的に、Google Appsを利用していると下記のようなMXレコードが返ってきますので、このようなMXレコードが設定されているならGoogle Appsを利用しているに違いないと考えられます。
$ dig example.com MX
; <<>> DiG 9.8.3-P1 <<>> example.com MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19847
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;example.com. IN MX
;; ANSWER SECTION:
example.com. 299 IN MX 1 aspmx.l.google.com.
example.com. 299 IN MX 5 alt1.aspmx.l.google.com.
example.com. 299 IN MX 5 alt2.aspmx.l.google.com.
example.com. 299 IN MX 10 aspmx2.googlemail.com.
;; Query time: 50 msec
;; SERVER: 192.168.251.1#53(192.168.251.1)
;; WHEN: Mon Jul 4 21:28:34 2016
;; MSG SIZE rcvd: 137
しかし、MXレコードに直接Google Appsのサーバーが設定されていないケース(メールをGoogle Appsに渡す前にウイルスチェックサーバーを経由させる設定をしている場合など)は、この方法は上手く動きませんので注意が必要です。