メール認証の例題
このメール認証の例題では、メールアドレスの所有者を確認し、不正なメールの使用を回避することができます。
シナリオ
この方法は、次のように機能します:
1. 認証を有効化する
ログインフォームをアプリで使用するため、公開ページの 認証 オプションを選択します。 ログインフォームをアプリで使用するため、公開ページの 認証 オプションを選択します。
2. メールアドレスを入力する
アプリ開始時にメールを要求されます。 ユーザーがメールアドレスを入力して Login ボタンをクリックすると、On Mobile App Authentication データベースメソッドが呼び出され、ユーザーのセッションステータスが "pending" (保留) に更新されます。 その後、ユーザーに認証メールが送信されます。
3. メールボックスを確認して、4. リンクをクリックする
ユーザーは、受信した認証メールの認証リンクをクリックします。 これにより、On Web Connection
データベースメソッドが呼び出され、ユーザーセッション のステータスが "pending" から "accepted" に更新されます。
5. および 6. アプリに戻る
認証完了後、ユーザーはアプリに戻って Login ボタンをクリックします。 On Mobile App Authentication
メソッドが再度呼び出されますが、今回はユーザーのセッション状態が "accepted" なため、アクセスが許可されます。
一連の流れを図に表しました:
この手順には、特別なコンポーネントを使用するか、手動で処理することができます。
4D Mobile App Server コンポーネントの使用
4D Mobile App Server コンポーネントは、いくつかの一般的なモバイル機能を管理するために開発されたツールボックス・コンポーネントです。 このコンポーネントは、メール認証ログイン用のメソッドを提供します。
On Mobile App Authentication
データベースメソッド内で、モバイルアプリから渡された情報とともにMobile App Email Checker
メソッドを呼び出します:
// On Mobile App Authentication データベースメソッド
#DECLARE ($mobileInfo : Object) -> $result : Object
$result:= Mobile App Email Checker($mobileInfo)
On Web Connection
データベースメソッド内で、URL より取得したSession
IDパラメーターを指定して、Mobile App Active Session
メソッドを呼び出します:
// On Web Connection データベースメソッド
#DECLARE ($info : Text)
Case of
: (Mobile App Active Session($info).success)
// 必要に応じてログを追加します
End case
このように、とても簡単です。
詳細については、Email Checker メソッドのドキュメント を参照ください。
コンポーネントを使用しない場合
4D Mobile App Server コンポーネントを使用せずに、独自のメール認証を実装することができます。 基本的な例:
On Mobile App Authentication
データベースメソッドに以下のコードを書きます:
// On Mobile App Authentication データベースメソッド
#DECLARE($request : Object)->$response : Object
var $mail;$status : Object
// 認証用の URL を持つメールを作成します
$mail:=New object
$mail.from:="myapplication@gmail.com"
$mail.to:=$request.email // ユーザーが入力したメールアドレス
$mail.subject:="ログイン確認"
$mail.htmlBody:="<a href=\"https://myserverapplication/activation/"+$request.session.id \
+"\">メールアドレスを確認するため、ここをクリックしてください。</a>\"<br>"
// メールを送信します
$smtp:=New object("host";"smtp.gmail.com";"user";"myapplication@gmail.com";"password";"xxx")
$transporter:=SMTP New transporter($smtp)
$status:=$transporter.send($mail)
// モバイルアプリのレスポンスオブジェクトを設定します
$response:=New object
// カレントセッションが検証中であることを宣言します
$response.verify:=True
// メール送信に成功したか確認します
If ($status.success)
// 全プロセスからアクセス可能な共有オブジェクトを作成し、セッションを格納します
If (Storage.pendingSessions=Null)
Use (Storage)
Storage.pendingSessions:=New shared object
End use
End if
Use (Storage.pendingSessions)
// セッションリストにこのセッションを追加します
Storage.pendingSessions[$request.session.id]:=$request.team.id+"."+$request.application.id
End use
$response.success:=True
$response.statusText:="メールボックスを確認してください。"
Else
// スマートフォンにエラーメッセージを表示します
$response.statusText:="メールを送信できませんでした。時間をおいて再送信してください。"
$response.success:=False
End if
On Web Connection
データベースメソッドには、ユーザーが確認メールのリンクをクリックした後に、該当セッションを有効にするためのコードを記述します。
// On Web Connection データベースメソッド
#DECLARE($url : Text; $header : Text; \
$BrowserIP : Text; $ServerIP : Text; \
$user : Text; $password : Text)
var $token ; $session : Text
var $sessionFile ; $sessionObject : Object
If ($url="/activation/@")
$token:=Substring($1;13)
End if
// URL から受け取った ID でセッションを取得します
If (Storage.PendingSessions#Null)pendingSessions#Null)
$session:=Storage.pendingSessions[$token]
End if
If ($session#"")
// セッションフォルダーを取得します
$sessionFile:=Folder(fk mobileApps folder).folder($session).file($token)
$sessionObject:=JSON Parse($sessionFile.getText())
// ステータス値を更新します
$sessionObject.status:="accepted"
$sessionFile.setText(JSON Stringify($sessionObject) )
Use (Storage.pendingSessions)
// 保留セッションを削除します
OB REMOVE(Storage.pendingSessions;$token)
End use
/*
MOBILE APP REFRESH SESSIONS コマンドは、サーバーの MobileApps フォルダーに
あるモバイルアプリのセッションファイルをすべてチェックし、
編集済みのファイルについてはメモリ内のセッションコンテンツを更新します。
*/
MOBILE APP REFRESH SESSIONS
WEB SEND TEXT("認証に成功しました")
Else
WEB SEND TEXT("無効なセッションです")
End if
リモートURLの定義
デフォルトでは、リモートサーバーの URL は Android アプリに定義されています。 URL が正しくない場合、サーバーにアクセスできなくなります。 この URL を修正・更新したい場合には、ログイン画面のアイコンを長押しするか、設定タブからおこないます。 アイコンを長押しすると、リモートURL のアドレスとサーバーのアクセス状況のメッセージが表示されます。 URL を編集して、認証に成功すると、サーバーにアクセスできるようになります。
iOS の場合、iOSデバイスの設定画面からリモートサーバーの URL を編集することができます。 これには、"サーバーアドレスをリセット" にチェックを入れて、正しいサーバーアドレスを入力します。