iT邦幫忙

0

如何使用 Laravel Sanctum api

  • 分享至 

  • xImage

小弟使用 Laravel 一段時間,但還沒使用過 Sanctum,想請問如何使用,並且下載 excel 檔。

現有一個需求:

某網站由其它廠商建立,非 laravel 系統。在前台架構不變的情況下,我這邊用 laravel 另外建一套管理系統。我的 laravel 後台可以下載 excel 。例如進入訂單管理的頁面,點擊 匯出,可以彈出 modal 視窗,選 xlsx, csv, 還可以選語言(標題)。我使用 laravel excel 。

後台的前端程式碼

<script>
//Export
$('#button-export-save').on('click', function () {
    var dataString = $('form').serialize();

    $.ajax
    ({
        type: "POST",
        url: "/new-admin/exports/sales/orders",
        data: dataString,
        cache: false,
        xhrFields:{
            responseType: 'blob'
        },
        success: function(data)
        {
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(data);
            link.download = 'orders.' + ext;
            link.click();
            $('#modal-option').modal('hide');
        },
    });
});
</script>

非常的 ok ,還不錯。

現在說,要在前台讓某些會員,例如公司的業務,下載訂單 excel 。要使用前台而不是後台。前後台共享同一套資料庫。

該怎麼做呢?

拜了 google 大神。還在想解法。

比如說登入,說用 sanctum 還是會需要登入,用帳號、密碼登入。這個我就有疑問。難道要把帳號密碼寫在前台的ajax呼叫?
http://abc.test/api/sales/orders?user=peter&password=1234
使用者打密碼的時候都還要以星號呈現,不太可能這樣明碼顯示。而且這不是登入頁,此時沒有密碼。不可能要使用者另外重打一次。把密碼寫入session好像也沒看到有人這樣做。

我想到的做法是,

  • 前端登入的時候,同時對api做登入請求。也就是說,相當於同時登入了兩個系統。登入api的網址:http://abc.test/api/login
  • 此時前端程式碼因為不是 laravel, 所以不能在表單裡使用 laravel 的 csrf() 函數。但是可以透過 api 請求,取得 csrf(): http://abc.test/api/getCsrf 然後頁面載入的時候就先取得 laravel 的 csrf(), 塞入 <inputh type="hidden" name="csrf" value="">
  • 然後那個下載按鈕的ajax網址就可以用 http://abc.test/api/sales/orders/export

我發問的時候還沒實作,只是覺得這樣應該可以。但是這樣好像跟 Sanctum 關係不大?是這樣用嗎?有其它方式嗎?

然後,我這還是前後台共享同一套資料庫的情況。如果根本就是兩套不同系統,不同資料庫,不同站台。A站台如何對B站台要求excel檔案?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0

首先,第一個想法是可以的。
也就是在登入的同時。也一起取得另一個站的登入權限或証書存放。
當然了,如就單一功能來說。其實這也不是很好的做法。但總是一種做法。

第二
一般API請求理論上不該會有CSRF的問題。
如果會有CSRF問題的話,這也代表你原來的請求並非是API式的應用。

最後,一般如果要直接做下載。並需要有認証的情況。
大多數來說我會做二次演算的方式。
或是加密模式。

也研是說,你可能需要送「user=peter&password=1234」
這是碼我會利用一下可還原加密的方式。
如BASE64等方法。將要送的值加密後再傳。
但雖這樣說,可是前端加密也是一件很笨的事。
畢竟啥都看光光了。

這時就只好用兩階段取得了。
第一次請求先拿到對應的KEY或加密碼。
再用取得的KEY去取檔案。

當然,這個KEY要有時效性。且在生成KEY要有安全機制。如驗証來源IP或域名等等。

我要發表回答

立即登入回答