Bình authlib Python - cách xử lý mã thông báo làm mới?
Tôi chỉ cần oauth2 để đăng nhập cho đến nay, nhưng tôi cảm thấy rằng để hoàn thiện một cách hợp lý, ứng dụng của tôi vẫn phải xử lý các mã làm mới.
Tôi còn khá mới đối với oauth, vì vậy, đây là hiểu biết của tôi:
Bằng cách giữ thời gian tồn tại của mã thông báo truy cập ngắn, nhưng thời gian tồn tại của mã thông báo làm mới dài, bạn buộc khách hàng phải "đăng ký" thường xuyên để gia hạn mã thông báo truy cập và do đó duy trì nhiều quyền kiểm soát hơn.
Nhưng làm thế nào để thực sự làm điều đó bằng cách sử dụng authlib và tích hợp bình?
Dường như không có refresh_token () trên FlaskRemoteApp và tôi không thể tìm thấy bất kỳ mã mẫu nào hiển thị điều này.
Điều này dường như hoạt động để nhận mã thông báo mới
res = oauth.myOauth2.fetch_access_token(refresh_token=session['tok_res']['refresh_token'])
session['tok_res'].update(res)
Nhưng không thành công khi sau đó sử dụng access_token mới cho một cuộc gọi api.
Có thể là do lỗi máy chủ, hoặc có thể tôi cần đợi mã thông báo cũ hết hạn trước khi sử dụng mã mới? Thời gian expires_at, tiếp tục cập nhật và điều đó không có ý nghĩa gì đối với tôi trong trường hợp đó.
Sẽ thật tuyệt nếu ai đó có thể giải thích cách refresh_token được dự định sử dụng với authlib và flask.
Trả lời
Vâng, trừ khi @lepture giảm bởi với những câu trả lời, tôi có ít nhất một câu trả lời.
Tôi chỉ đơn giản là bỏ lỡ grant_type='refresh_token'cuộc gọi của tôi.
Vì vậy, điều này bây giờ hoạt động như mong đợi đối với tôi.
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)
Tôi đã thử một chút với việc thiết lập hàm update_token trong sổ đăng ký, nhưng không thể làm cho nó hoạt động. Trong mọi trường hợp, tôi tin rằng điều này chỉ được kích hoạt nếu một lệnh gọi api sử dụng mã thông báo nhận được phản hồi "mã thông báo đã hết hạn". Trong trường hợp của tôi, tôi chỉ sử dụng Oauth để đăng nhập, vì vậy tôi chỉ có thể xem thời gian expires_at và chỉ truy cập máy chủ auth khi cần thiết.