Django oauth2: httponly replesher token cookie не переживает в браузер (но работает в почтальстве)Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Django oauth2: httponly replesher token cookie не переживает в браузер (но работает в почтальстве)

Сообщение Anonymous »

Я реализовал Google oauth2 вход в Django (с pkce ) с django oauth toolkit .
После входа в систему сервер создает Access_token (в образе ответов) и represh_token , который storted in htton> htston> htston> ht in ht in ht in htston cookie :

Код: Выделить всё

@api_view(["POST"])
def google_login(request):
code = request.data.get("code")
if code:
code = unquote(code)
code_verifier = request.data.get("code_verifier")

if not code or not code_verifier:
return Response({"error": "Missing code or code_verifier"}, status=400)

# Google token exchange
token_resp = requests.post("https://oauth2.googleapis.com/token", data={
"client_id": GOOGLE_CLIENT_ID,
"client_secret": GOOGLE_CLIENT_SECRET,
"code": code,
"code_verifier": code_verifier,
"grant_type": "authorization_code",
"redirect_uri": REDIRECT_URI,
}).json()

if "error"  in token_resp:
return Response({"error": "Google exchange failed",
"details": token_resp}, status=400)

access_token = token_resp.get("access_token")

# Retrieving and storing user information
userinfo = requests.get("https://openidconnect.googleapis.com/v1/userinfo",
headers={"Authorization": f"Bearer {access_token}"}).json()

email = userinfo.get("email")
if not email:
return Response({"error": "No email returned by Google",
"userinfo": userinfo}, status=400)

user, _ = User.objects.get_or_create(email=email, defaults={
"username": email,
"first_name": userinfo.get("given_name", ""),
"last_name": userinfo.get("family_name", ""),
"avatar": userinfo.get("picture", ""),
})
assign_user_role(user)

# token generation
app = Application.objects.get(name="React SPA")
expires = timezone.now() + timedelta(seconds=oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS)

access_token_obj = AccessToken.objects.create(
user=user,
application=app,
token=generate_token(),
expires=expires,
scope="read write"
)

refresh_token_obj = RefreshToken.objects.create(
user=user,
token=generate_token(),
application=app,
access_token=access_token_obj
)

response = Response({
"access_token": access_token_obj.token,
"expires_in": oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS,
"token_type": "Bearer"
})

response.set_cookie(
"refresh_token",
refresh_token_obj.token,
httponly=True,
secure=False, # True on prod
samesite="Lax",
path="/",
)

return response
< /code>
Я также реализовал пользовательскую конечную точку токена (CustomTokenView), которая поддерживает обновление по cookie (а не через корпус запроса), то есть: < /p>
@method_decorator(csrf_exempt, name='dispatch')
class CustomTokenView(OAuthLibMixin, APIView):
def post(self, request, *args, **kwargs):
if request.data.get("grant_type") == "refresh_token":
refresh_token_cookie = request.COOKIES.get("refresh_token")
if refresh_token_cookie:
post = request._request.POST.copy()
post["refresh_token"] = refresh_token_cookie
request._request.POST = post

url, headers, body, status = self.create_token_response(request._request)

token_data = json.loads(body)

if status == 200:
access_token = token_data.get("access_token")
refresh_token = token_data.get("refresh_token")

if access_token:
token_checksum = hashlib.sha256(access_token.encode("utf-8")).hexdigest()
token = get_access_token_model().objects.get(token_checksum=token_checksum)
app_authorized.send(sender=self, request=request, token=token)

response_data = {
"access_token": access_token,
"expires_in": token_data.get("expires_in", oauth2_settings.ACCESS_TOKEN_EXPIRE_SECONDS),
"token_type": token_data.get("token_type", "Bearer"),
}

response = Response(response_data, status=status)

if refresh_token:
response.set_cookie(
"refresh_token",
refresh_token,
httponly=True,
secure=False,  # Local
samesite="Lax",
path="/",
)

return response

return HttpResponse(content=body, status=status, headers=headers)
< /code>
Мои Urls:  < /p>
v1_patterns = [
...
path('auth/authorize/', oauth2_views.AuthorizationView.as_view(), name="authorize"),
path('auth/token/', CustomTokenView.as_view(), name="token"),
path("auth/google/", google_login, name='google_login'),
]

urlpatterns = [
...
path("api/v1/", include(v1_patterns)),
]
< /code>
[b] Проблема: < /strong>
В почтальнице, cookie represh_token установлен без каких -либо проблем. http://127.0.0.1:5173) [/b] я делаю [b] post [/b] в Backend [b] (http://127.0.0.1:8000/api/v1/auth/google/) [/b]
await fetch("http://127.0.0.1:8000/api/v1/auth/google/", {
method: "POST",
credentials: "include",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ code, code_verifier }),
});
cors в настройках :
CORS_ALLOWED_ORIGINS = [
"http://127.0.0.1:5173",
]
CORS_ALLOW_CREDENTIALS = True
< /code>
Итак, мой вопрос < /strong>:
Почему браузер не сохраняет файл cookie rupresh_token после запроса, хотя он и в почтальце? Игнорировать Set-cookie?>

Подробнее здесь: https://stackoverflow.com/questions/797 ... rowser-but
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Мой браузер Dev Tools -> Application -> Cookie отображает httponly cookie, установленные моим бэкэнд [Duplicate]
    Anonymous » » в форуме Javascript
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как сохранить токен обновления в httponly cookie с Google OAuth2 (PKCE Flow) в Django?
    Anonymous » » в форуме Python
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Файл cookie XSRF-TOKEN создан без флага httponly — Laravel 5.8
    Anonymous » » в форуме Php
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Аутентификация API API Token Sanctum Sanctum не работает в почтальстве
    Anonymous » » в форуме Php
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • Cookie Cookie Cookie Cookie Core Identity ASP.NET хранится, но не разрешается - Blazor Web App
    Гость » » в форуме C#
    0 Ответы
    46 Просмотры
    Последнее сообщение Гость

Вернуться в «Python»