用 refresh token 换取新的 access token。
()
| 1530 | |
| 1531 | @app.route('/api/auth/refresh', methods=['POST']) |
| 1532 | def auth_refresh(): |
| 1533 | """用 refresh token 换取新的 access token。""" |
| 1534 | data = request.get_json(silent=True) or {} |
| 1535 | token = data.get('refresh_token') |
| 1536 | try: |
| 1537 | claims = decode_token(token) if token else None |
| 1538 | if not claims or claims.get('type') != 'refresh': |
| 1539 | raise ValueError("not a refresh token") |
| 1540 | except (_jwt.PyJWTError, ValueError): |
| 1541 | return error_response("UNAUTHORIZED", "刷新令牌无效或已过期") |
| 1542 | return jsonify({ |
| 1543 | 'token_type': 'Bearer', |
| 1544 | 'access_token': create_access_token(claims.get('sub'), claims.get('role', 'viewer')), |
| 1545 | }) |
| 1546 | |
| 1547 | |
| 1548 | # 角色 -> 权限映射(RBAC 由后续 PR 进一步细化与强制) |
nothing calls this directly
no test coverage detected