やりたかったこと
ユーザが初回ログイン時に書類(免許証とか)をUploadするよう強制したい。
ログインフローを使えばできそうだが、果たしてそんなことはできるのか?
結論
コツ(下記)が必要だが、できる。
コツ
前提情報
ログインフローを実行中のセッションは、ログインフロー以外の通信ができない制限付きセッションとなっている。
そして、ファイルアップロードはログインフロー以外の通信と判定されてしまうため、以下の方法で普通に実装してもブロックされ、エラーとなってしまう。
- 案1: ログインフローにフローを選び、標準の「ファイルのアップロード」コンポーネントを画面に配置する
- 案2: ログインフローにフローを選び、LWCで作ったファイルアップロード用コンポーネントを画面に配置する
- 案3: ログインフローにVisualforceを選び、ファイルアップロード用Visualforceを指定する
ではどうすればエラーを回避できるか?
対応として、Visualforceの場合のみ呼び出せる制限解除用メソッドAuth.SessionManagement.finishLoginFlow()をファイルアップロードに先立って呼び出すことでファイルアップロードが可能となる。
なお、Winter '22時点では、このメソッドをVisualforceではなくLWCで使うと以下のエラーが出る。そのため、案3をベースにVisualforceのコードを改良して利用することになる。
Class.Auth.SessionManagement.finishLoginFlow: line 79, column 1
Class.AuthController.finishLoginFlow: line 5, column 1
01:45:48.0 (5193470)|FATAL_ERROR|System.NullPointerException: Attempt to de-reference a null object
注意点
Auth.SessionManagement.finishLoginFlow()を呼んだ時点でログインフローは完了したものとみなされる。
よって、ログインフローでカスタムのMFAを実行する場合は、ファイルアップロードの前にその処理を持ってくる必要がある。
また、ファイルアップロードを終える前にホーム画面等のURLを直打ちされてしまうとブロックされずに普通に開ける。ここは制約として考える必要がある。
ソース
<apex:page controller="FileUploaderController" showHeader="false" applyHtmlTag="true" applyBodyTag="false">
<head>
<apex:slds />
</head>
<body class="slds-scope" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<apex:messages id="msg"/>
<apex:form id="theForm">
<apex:inputFile value="{!file}" />
<apex:commandbutton action="{!upload}" value="Upload"/>
</apex:form>
</body>
</apex:page>
public class FileUploaderController {
public FileUploaderController () {
//ポイント:コンストラクタでfinishLoginFlowを実行すること!!
Auth.SessionManagement.finishLoginFlow();
}
public blob file { get; set; }
public PageReference upload() {
//ContentVersionをInsert
ContentVersion v = new ContentVersion();
v.versionData = file;
v.title = 'testing upload';
v.pathOnClient ='/somepath.txt';
insert v;
//ホーム画面に遷移
return new PageReference('/cs/s');
}
}




