Python Authlib Flask - วิธีจัดการกับโทเค็นการรีเฟรช

Oct 25 2020

ฉันต้องการแค่ oauth2 สำหรับการเข้าสู่ระบบเท่านั้น แต่ฉันรู้สึกว่าเพื่อให้สมบูรณ์พอสมควรแอปของฉันควรจัดการกับโทเค็นการรีเฟรช

ฉันค่อนข้างใหม่สำหรับ oauth ดังนั้นนี่คือความเข้าใจของฉัน:
ด้วยการรักษาอายุการใช้งานโทเค็นการเข้าถึงให้สั้น แต่อายุการใช้งานของโทเค็นการรีเฟรชจะยาวนานคุณบังคับให้ไคลเอ็นต์ "เช็คอิน" เป็นประจำเพื่อต่ออายุโทเค็นการเข้าถึงและด้วยเหตุนี้จึงควบคุมได้มากขึ้น

แต่จะทำอย่างไรโดยใช้ authlib และการรวมขวด?
ดูเหมือนว่าจะไม่มี refresh_token () บน FlaskRemoteApp และฉันไม่พบโค้ดตัวอย่างที่แสดงสิ่งนี้

ดูเหมือนว่าจะได้รับโทเค็นใหม่

res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)

แต่ล้มเหลวเมื่อใช้ access_token ใหม่ในภายหลังสำหรับการเรียก API
ฉันคิดว่าอาจเป็นข้อผิดพลาดของเซิร์ฟเวอร์หรือฉันอาจต้องรอให้โทเค็นเก่าหมดอายุก่อนจึงจะใช้ใหม่ได้ เวลา expires_at อัปเดตอยู่ตลอดเวลาและนั่นก็ไม่สมเหตุสมผลสำหรับฉันในกรณีนั้น

จะดีมากถ้าใครสามารถอธิบายได้ว่า refresh_token มีไว้เพื่อใช้กับ authlib และ flask อย่างไร

คำตอบ

1 Alias_Knagg Nov 03 2020 at 11:16

ดีเว้นแต่@leptureลดลงโดยมีคำตอบผมมีอย่างน้อยคำตอบ ฉันหายไปจากการโทร ตอนนี้สิ่งนี้ได้ผลตามที่ฉันคาดไว้
grant_type='refresh_token'

if session['oatoken']['expires_at'] - 2 < now:  # refresh 2 seconds early
    oatoken = oauth.myOauth2.fetch_access_token(
        refresh_token=session['oatoken']['refresh_token'],
        grant_type='refresh_token')
    session['oatoken'].update(oatoken)

ฉันเล่นไปเล็กน้อยกับการตั้งค่าฟังก์ชัน update_token ในรีจิสทรี แต่ไม่สามารถทำงานได้ ไม่ว่าในกรณีใดฉันเชื่อว่าจะเกิดขึ้นก็ต่อเมื่อการเรียก API โดยใช้โทเค็นได้รับการตอบกลับ "โทเค็นหมดอายุ" ในกรณีของฉันฉันใช้ Oauth สำหรับการเข้าสู่ระบบเท่านั้นดังนั้นฉันจึงสามารถดูเวลา expires_at และกดเซิร์ฟเวอร์รับรองเมื่อจำเป็นเท่านั้น