JWT token이 만료된 시간에만 효력을 상실하는 메커니즘을 유지합니다

3352 단어 token
최근 프로젝트의 점진적인 마무리는 마지막 RBAC와 token 테스트에서 작은 문제점을 발견했다. token의 상호작용에서 서버를 다시 시작하면 이전에 생성된 token이 효력을 잃는 것을 발견했다.이것은 우리의 일상적인 사용에서 절대 허용되지 않는다. 그렇지 않으면 만약에 한 사람이 앱을 사용하고 있다면 우리 서버가 업데이트되었다. 그가 다시 요청을 방문할 때 자신이 다시 로그인해야 한다는 것을 발견하면 매우 좋지 않은 사용자 체험을 가져올 수 있기 때문에 개선이 필요하다.그러나 Token이 가능한 JWT 메커니즘을 실용화한 것을 감안하면session과 cookie의 저장 연결 메커니즘을 버리고 끝까지 상태가 없다.그래서 전 과정에 토큰을 상태있는 메커니즘으로 처리하지 않았다.

사고방식을 해결하다


우리가 현재 성숙한 JWT를 사용하여 토큰을 생성할 때 중요한 것이 하나 있다priv_key, 이것은 JWK 클래스의 데이터입니다. 이것은 하나의 클래스로 봉인되었습니다.우리는python에서 다음과 같이 값을 출력할 수 있습니다.
 key = jwk.JWK.generate(kty='EC', crv='P-256')
 key.export(private_key=False)

"{"y":"VYlYwBfOTIICojCPfdUjnmkpN-g-lzZKxzjAoFmDRm8","x":"3mdE0rODWRju6qqU01Kw5oPYdNxBOMisFvJFH1vEu9Q","crv":"P-256","kty":"EC"} 이전의 메커니즘은 서버를 다시 시작할 때마다generateJWK의 문장을 실행하기 때문에 생성된 JWK에 의 값은 y와 x의 값에 따라 JWK가 다르기 때문에 다시 검증할 때 검증된priv_키 매개 변수는 이미 당신의 최초의 것이 아니기 때문에 검증에 성공하지 못했습니다.
결국 나는 비교적 멍청하지만 실용적인 방법을 채택했다. 바로priv_를key는 미리 생성된 다음에 token의 각종 조작을 할 때마다 가지고 있는 JWK류의 비밀 키는 바로 우리가 미리 생성한priv_key, Token은 유효기간이 만료되었을 때만 효력을 상실하고, 서버를 다시 시작한 후에 효력을 상실하지 않습니다.

해결 코드의python

import python_jwt as jwt, jwcrypto.jwk as jwk ,datetime

key = {"d":"igkREvy4tJjCjdttFZzfVcsJO0Wj0MGtxZFcremC5bNCibqQFrp-pRGkjrJIMxSiXYcaXXyVu5L11MvsKWVKA9lWhAiX8gbJ9cXirsWtIlhutO_Lv2X1kOBlJyQkdb6oPuOi5VUcXuAjWFRUvH5P60UJA1yXRZMn9gzxgMSDErGkhnFQejxBE5Qde3mUxf4pm7ysvq9eZ9xPhferl6oZ_QF60Ajj5dcJ8DWLCIftqUSwNnbMhl0Wa94PGje3kkslt1JkIaaj4ZeAL3oKmxm__hq7pG0cWGgrp6GJTOoiIOy9KHP8iaGN4GQ2diUp1iBSNFwjgN1I7RzTzq19DewIAQ","dp":"OqlXvoSVF6boqYTKhcDNQnjE-ImQWqe753BhV_SQSSeb5wlw-9O_fu23C9HyG1JCEQuJmdgm9lpiI4qwUZimuSnEOZ-FyXL440dRCNw9rew-UnTkHxaTu1ATaBtM-eFrzbtjOv9O99ITQTSCvnkDVzxuaprddstOWbJH07Bm9gE","dq":"VpCAsfGOEpxQHv__AihrJNW-5XpB1E2lxGVnM0bSlAhlMY9LRRtdr93asz7A2TB_wcSk67MgP3UeAGk2buS2C89Vsl6LMeYQQFrxcT2YyobUeRUrKtgIYsoSbHLVsqUHkM3oSqTxYOPg9OQmf-oL3jq3hhtZT0T3HriNMN_ndqk","e":"AQAB","kty":"RSA","n":"4uXpp92owv-SHgLRgboYflOX63Irhe-hU21cn25uaH6Er-nFEJHQWrdDExaU3sIS1wF54nuinazfIu2Ndc56feVuy2G2bwWCTwbss_34bGuEjGBRQeBQEtas7IBwwzbisTcW9FOwDBmleAECLPChjycoASqCnUaGGeUOH8H5MFXc4xcaDnSYG3ZKfzTgfqsAsp2__DIyB39T8ez0Ey9ux7DVjkHZ_2V7NJ9f2N1kY3TpczayHaa4I9FdGzKe6uv7KbWHK1V7Mml-JowagXIKRx30aaBtsdRNE3ICHi3vBS3VSzwGEsPk53U-x7Oer5NusXbE133hTX-j4vTgZDIpCw","p":"8daGAzGb74KGePZCCKcj4iTuzmSpiv3-_P5B3pE6DJdkOTjMR4MWzC6KCHyLaetxHfZpoU50NlK_oedLc0UCZX5CThlF9DEvn2Gb_8NMQOWDbuztLKquC_IhVmhWRTAQef0FLOv7ipa_ZYej72CJ2fWfpv_jbTYcU45VJ9w6ZgE","q":"8C9rleVhoglOopNKzrOKDMFlLX1puPtiN4a8rhWnPmrV1rCWDKTyCDBSusfm8PiYzQVnqTUme3DoQlJbvH1uQKeIXSscJBVaX8IcfCcgYtdH1cq4xWDBeNoJLMEH_jVvWcHBwD2xEupjBtyeBdCzDR7i60PXXPlDR9Ufckplxws","qi":"NLFbHCmgEaNuq17i4u0BDIYa8r0GiIYubT-M538lLtOM2CUCOax1UdUoihb0e6fhAQcZjQGayJCNYpNpsHBxt3pY2j4ygiqB3muEmS7-SlkYKeVxEg_q8LbZ8RxBzIQ5ZOQeoZJf5SElRa77wInSk2-pGGaU9RkruY8Gwd6ysEU"}
  #  priv_key 
tokenKey = jwk.JWK(**key)  #  JWK 
payload = {'message':'helloWord!'}  #  
token = jwt.generate_jwt(payload, tokenKey, 'RS256', datetime.timedelta(minutes=100))  #  SMSCodetoken 60S
print(token)


이로써 당신은 서버의 제한을 받지 않는 토큰을 생성할 수 있습니다.

좋은 웹페이지 즐겨찾기