TIL #67 : [Django] 코드에 로그인 데코레이터 적용하기🖤

셀레스틴 허·2021년 2월 11일
0
post-thumbnail

@login_decorator..?

데코레이터를 정말 장식품처럼 코드 위에 걸어놓기만 했다... 같이 천천히 적용해보자.

✅ 로그인 데코레이터는 따로 utils.py라는 파일을 만들고 거기에 담았다.

login_decorator 코드

코드를 뜯어보면 이런 뜻이다.

  1. 프론트에서 보내준 request header 속에 {'Authorization' : '토큰'}이 있으면 이걸 access_token으로 저장한다.
  2. SECRET_KEY, ALGORITHM으로 보안된 access_token을 decode 해서 payload 변수에 넣는다.
  3. payload에는 (토큰에 담은) 우리 정보(PK, id)가 들어있다! id값을 추출해 user 변수에 담는다.
  4. 그리고 request의 가변적인 특성을 이용해 request.user를 우리가 아까 선언한 user 변수로 바꾼다.
  5. 이제 Authorization : TOKEN 으로 사용자를 로그인 상태로 유지할 수 있다!

일단 views.py ➡️ Posting에 적용해봤다.

Posting은 게시물 등록, 나열 기능을 담당하고 있다.

GET

기존 코드

수정한 코드

SUCCESS HTTP REQUEST

http -v GET 127.0.0.1:8000/posting/comment "authorization:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6M30.TFktnKt-LfDLruDr2m9Qv3vt15Fb9XjgnoJLtT4U0KQ"

SUCCESS RESULT

HTTP/1.1 201 Created
Content-Length: 187
Content-Type: application/json
Date: Thu, 11 Feb 2021 03:08:06 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.1
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "data": [
        {
            "comment_username": "highlighter",
            "created_at": "2021-02-09T23:05:37.091Z",
            "posting_photo": 4,
            "root": 12,
            "text": "Please  work I do not want to get angry in the morning"
        }
    ]
}

POST

기존 코드:

수정한 코드:

SUCCESS HTTP REQUEST

http -v POST 127.0.0.1:8000/posting image_url='https://image.com/0987' description='Apple Macbook Pro 16inch' "Authorization:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6M30.TFktnKt-LfDLruDr2m9Qv3vt15Fb9XjgnoJLtT4U0KQ"

SUCCESS RESULT

POST /posting HTTP/1.1
Accept: application/json, */*;q=0.5
Accept-Encoding: gzip, deflate
Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6M30.TFktnKt-LfDLruDr2m9Qv3vt15Fb9XjgnoJLtT4U0KQ
Connection: keep-alive
Content-Length: 82
Content-Type: application/json
Host: 127.0.0.1:8000
User-Agent: HTTPie/2.3.0

{
    "description": "Apple Macbook Pro 16inch",
    "image_url": "https://image.com/0987"
}


HTTP/1.1 200 OK
Content-Length: 22
Content-Type: application/json
Date: Thu, 11 Feb 2021 03:13:24 GMT
Referrer-Policy: same-origin
Server: WSGIServer/0.2 CPython/3.9.1
Vary: Origin
X-Content-Type-Options: nosniff
X-Frame-Options: DENY

{
    "message": "SUCCESS"
}

게시물이 잘 등록됐는지 mysql 들어가서 확인하자

mysql> select * from postings;
+----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+--------------------------+-------------+
| id | image_url                                                                                                                                                                                                                                               | created_at                 | description              | username_id |
+----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+--------------------------+-------------+
|  2 | https://imageurlwillchange.com                                                                                                                                                                                                                          | 2021-02-05 00:48:07.298620 | NULL                     |           1 |
|  3 | https://www.google.com/url\?sa=i\&url=https%3A%2F%2Fwww.amazon.com%2FCute-Cats-Blu-ray-Nada-Bascarevic%2Fdp%2FB07QK7SRKZ\&psig=AOvVaw1dLsxJzx8lZ6_7uynP-LjJ\&ust=1612572994804000\&source=images\&cd=vfe\&ved=0CAIQjRxqFwoTCPjv0NbE0e4CFQAAAAAdAAAAABAD | 2021-02-05 01:30:19.752123 | NULL                     |           1 |
|  4 | https://pleasework.com                                                                                                                                                                                                                                  | 2021-02-09 11:44:06.806212 | Oneshot Onekill...       |           3 |
|  5 | https://image.com/1234                                                                                                                                                                                                                                  | 2021-02-11 02:50:45.207880 | Heyyyyyy                 |           3 |
|  6 | https://image.com/0987                                                                                                                                                                                                                                  | 2021-02-11 03:13:24.457341 | Apple Macbook Pro 16inch |           3 |
+----+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+--------------------------+-------------+
5 rows in set (0.00 sec)

id #6으로 잘 들어갔다 :)

사용자의 id값을 이처럼 request.user로 바꾼다. 그리고 (로그인한 상태에서..!) 해당 기능을 실행할 수 있는지 확인한다. comment, like, follow도 수정하러 가야겠다🤯

profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글