我在Django中构建了一个API中心,在NextJS中构建了一个前端应用程序。我目前正在Nextjs中对Django API进行身份验证,我对最佳实践感到好奇。
目前,NextJS应用程序将用户的用户名/密码发布到端点。此终结点返回用户令牌或说明问题的错误。
React
const login = async () => {
let token = await axios.post('/api/accounts/', {
email: email,
password: password
}).then(r => r.data.token).catch(function (error) { console.log(error) })
if (token) {
router.push({
pathname: '/home/',
query: { token: token },
})
}
}
nexjs服务器api/accounts
export default async (req, res) => {
if (req.method === 'POST') {
try {
// retrieve payment intent data
const {data} = await axios.post('https://website/api/api-token-auth/', req.body)
res.status(200).send(data)
} catch (err) {
res.status(500).json({ statusCode: 500, message: err.message })
}
} else {
res.setHeader('Allow', 'POST')
res.status(405).end('Method Not Allowed')
}
}
Django API
@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def obtain_auth_token(request):
email = request.data.get("email")
password = request.data.get("password")
if email is None or password is None:
return Response({'error': 'Please provide both email and password'},
status=HTTP_400_BAD_REQUEST)
user = authenticate(email=email, password=password)
if not user:
return Response({'error': 'Invalid Credentials'},
status=HTTP_404_NOT_FOUND)
token, _ = Token.objects.get_or_create(user=user)
return Response({'token': token.key},
status=HTTP_200_OK)
一旦我收到令牌,我就把用户推到主页。
我的问题是:
1.我对用户进行身份验证的方式是一种好方法吗?我是不是忽略了什么?这是我第一次尝试对我构建的东西进行身份验证,所以我想把它做好。
1.我应该如何存储这个代币?在身份验证凭据方面,什么是“最佳实践”?我考虑过将令牌传递给每个需要它的组件。我也曾尝试过使用LocalStorage,但我还是不确定大多数人在这种情况下会怎么做。
任何帮助你都可以提供将不胜感激!
先谢谢你了!
1条答案
按热度按时间0wi1tuuw1#
我对用户进行身份验证的方式是一种好方法吗?我是不是忽略了什么?这是我第一次尝试对我构建的东西进行身份验证,所以我想把它做好。
我应该如何存储这个代币?在身份验证凭据方面,什么是“最佳实践”?我考虑过将令牌传递给每个需要它的组件。我也曾尝试过使用LocalStorage,但我还是不确定大多数人在这种情况下会怎么做。
不要使用cookie来避免CSRF攻击。本地存储是“快速和简单”的答案,因为你已经使用HTTPS。本地存储的一个缺点是你的令牌容易受到XSS攻击,但如果发生这种攻击,你已经严重受损。(XSS攻击者可以拦截密码和登录,那么访问令牌的意义何在?)。您可以找到更多信息here