在svelkit中使用JWT的身份驗證API

我無法使用svelte對我的API端點進行身份驗證。出于安全原因,我嘗試使用HTTPonly cookie通過JWT對我的端點進行身份驗證,但是,它不起作用。錯誤:“身份驗證憑據不是provided.”登錄后,我看不到cookie是存儲區。有人能幫忙嗎?

獲取登錄端點的代碼

<script>
    import { goto } from '$app/navigation';

    let username = '';
    let password = '';

    const submit = async () => {
        await fetch('https://myAPI/auth/jwt/create', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            credentials: 'include',
            body: JSON.stringify({
                username,
                password
            })
        });
     goto('/auth/me');
    };
</script>

我必須說,用戶注冊工作正常

<script>
    import { goto } from '$app/navigation';

    let username = '';
    let password = '';
    let email = '';
    let first_name = '';
    let last_name = '';

    const submitForm = async () => {
        await fetch('https://myAPi/auth/users/', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                username,
                password,
                email,
                first_name,
                last_name
            })
        });

        goto('/');
    };
</script>
? 最佳回答:

我相信我現在有足夠的元素來提供更準確的答案。

成功登錄后,API返回JWT訪問令牌,但未設置任何包含該令牌的cookie。事實上,您的API根本不依賴于cookie,因為受保護的路由不需要包含JWT令牌的cookie,而是包含令牌的授權頭。

這就是為什么我對你提供你的back-end的詳細實現如此缺乏耐心。

在您跟隨并在評論中鏈接的教程中,作者明確聲明他打算使用cookie進行身份驗證。這一選擇反映在front-end上(通過在fetch中使用credentials: include選項),也反映在back-end上,例如,在他的API的Laravel實現中(第35行),或者在其節點實現中(第40-43)行)。在這兩種情況下,您都可以看到back-end如何顯式設置和返回“jwt”cookie。

當向受保護路由發出請求時,作者還顯式地使用cookie讀回并驗證令牌(例如,請參見上面節點示例中的第52-54行)。

然而,正如我上面所說的,您的API并不依賴于相同的機制,而是希望設置一個“授權”請求頭。

所以你有兩個選擇。更簡單的選擇是調整client-side代碼以使用API提供的Auth機制運行。這意味著將令牌存儲在sessionStorage中,并在向受保護端點發出請求時正確設置授權標頭:

// login.svelte
<script>
    import { goto } from '$app/navigation';

    let username = '';
    let password = '';

    const submit = async () => {
        const result = await fetch('https://myAPI/auth/jwt/create', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                username,
                password
            })
        });
        const data = await result.json();
        const { refresh, access } = data;
        sessionStorage.setItem('token', access);
        goto('/auth/me');
    };
</script>

// auth/me.svelte
<script>
    import { onMount } from 'svelte';
    
    onMount(async () => {
        // read token from sessionStorage
        const token = sessionStorage.getItem('token');
        const result = await fetch('https://myAPI/auth/users/me', {
            method: 'GET',
            headers: { 
                'Content-Type': 'application/json',
                'Authorization': `JWT ${token}`
            }
        });
        const data = await result.json();
        console.log(data);
    });
</script>

另一種選擇是將API中的身份驗證機制從基于“授權”標頭的機制修改為基于cookie的機制(如果這確實是您想要的),但這會影響依賴于API的其他現有服務(如果有的話)。

主站蜘蛛池模板: 亚洲熟妇av一区| 偷拍精品视频一区二区三区| 性色AV 一区二区三区| 色噜噜AV亚洲色一区二区| 精品一区二区三区无码免费视频| 国产成人精品无人区一区| 国产激情一区二区三区小说| 亚洲日本va午夜中文字幕一区| 亚洲国产一区视频| 免费无码AV一区二区| 日本一道高清一区二区三区| 精品亚洲AV无码一区二区| 日韩人妻精品一区二区三区视频| 国产丝袜视频一区二区三区| 91精品一区国产高清在线| 国产精品免费大片一区二区| 国产伦精品一区二区| 濑亚美莉在线视频一区| 九九无码人妻一区二区三区| 亚洲色无码专区一区| 无码日本电影一区二区网站| 亚洲高清一区二区三区| 成人区精品一区二区不卡亚洲| 亚洲综合一区二区精品导航| 人妻体内射精一区二区三区| 人妻无码视频一区二区三区| 精品无人区一区二区三区在线| 国产精品制服丝袜一区| 狠狠色综合一区二区| 无码人妻久久一区二区三区免费丨| 亚洲综合av一区二区三区| 亚洲av成人一区二区三区在线播放| 亚洲色精品VR一区区三区| 日韩精品人妻一区二区三区四区 | 国产麻豆剧果冻传媒一区| 高清国产AV一区二区三区| A国产一区二区免费入口 | 日本强伦姧人妻一区二区| 亚洲av乱码中文一区二区三区 | 国产综合一区二区| 免费视频一区二区|