0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Salesforce]ログインフローからファイルをアップロードできるか?

Last updated at Posted at 2021-12-10

やりたかったこと

ユーザが初回ログイン時に書類(免許証とか)を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を直打ちされてしまうとブロックされずに普通に開ける。ここは制約として考える必要がある。

ソース

・ログインフロー
image.png

FileUploader.page
<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>
FileUploaderController.cls
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');
    }
}

動作

まずは普通にログインする。
image.png

ログインフローが起動し、Visualforceが表示された。 ここでファイルを選択してUploadボタンを押す。
image.png

無事トップ画面に遷移した。
image.png

ファイルタブにちゃんとUploadされた。
image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?