장고 깃허브로 로그인하기

김혁준·2023년 5월 18일
0

django

목록 보기
7/18
class GithubLogIn(APIView):
    def post(self, request):
        try:
            code = request.data.get("code")
            access_token = requests.post(
                f"https://github.com/login/oauth/access_token?code={code}&client_id=5195598d392601f20eea&client_secret={settings.GH_SECRET}",
                headers={"Accept": "application/json"},
            )
            access_token = access_token.json().get("access_token")
            user_data = requests.get(
                "https://api.github.com/user",
                headers={
                    "Authorization": f"Bearer {access_token}",
                    "Accept": "application/json",
                },
            )
            user_data = user_data.json()
            user_emails = requests.get(
                "https://api.github.com/user/emails",
                headers={
                    "Authorization": f"Bearer {access_token}",
                    "Accept": "application/json",
                },
            )
            user_emails = user_emails.json()
            try:
                user = User.objects.get(email=user_emails[0]["email"])
                login(request, user)
                return Response(status=status.HTTP_200_OK)
            except User.DoesNotExist:
                user = User.objects.create(
                    username=user_data.get("login"),
                    email=user_emails[0]["email"],
                    name=user_data.get("name"),
                    avatar=user_data.get("avatar_url"),
                )
                user.set_unusable_password()
                user.save()
                login(request, user)
                return Response(status=status.HTTP_200_OK)
        except Exception:
            return Response(status=status.HTTP_400_BAD_REQUEST)

깃허브로 로그인 하기 : 사용자가 장고로 요청을 보냄 > 장고는 사용자를 깃허브로그인 url로 보냄 > 사용자가 깃허브로 본인 정보를 허락하면 장고는 깃허브와 api를 시작함... = 장고는 깃허브에게 유저 정보를 요청함 > 깃허브는 장고로 정보를 넘겨줌 > 정보를 넘겨받은 장고는 유저를 로그인시키고 db에 저장함

profile
스프링 개발자 지망생입니다

0개의 댓글