我正在开发一个项目,需要使用 OAuth2 身份验证更新组织的 Google Drive 令牌。我的代码在本地计算机上运行良好,但是当我将其部署到服务器时,遇到无效的错误redirect_url。这是我的代码的相关部分:
def update_drive_gtoken(
data: schema.UpdateDriveToken,
sql: Session,
auth_token: frontendModel.FrontendToken,
organization: model.Organization
):
"""
Update organization drive token
"""
organization_user = sql.query(model.RegisterUserOrganization).filter_by(
user_id=auth_token.user_id,
org_uid=organization.id,
is_active=True,
is_deleted=False
).first()
if not organization_user:
CustomValidations.raize_custom_error(
error_type="not_exist",
msg="user does not belong to this organization"
)
token_json = None
if auth_token.user_id == organization.admin_id:
if data.code is not None:
CLIENT_ID = "1234.com"
CLIENT_SECRET = "FXXC"
REDIRECT_URL = "http://localhost:3000"
token_url = 'https://oauth2.googleapis.com/token'
token_data = {
'code': data.code,
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'redirect_uri': REDIRECT_URL,
'grant_type': 'authorization_code'
}
token_response = requests.post(token_url, data=token_data, timeout=80, verify=False)
token_json = token_response.json()
extracted_token = {
'access_token': token_json.get('access_token'),
'refresh_token': token_json.get('refresh_token'),
'client_id': CLIENT_ID,
'client_secret': CLIENT_SECRET,
'expires_in': (datetime.utcnow() + timedelta(seconds=token_json['expires_in'])).isoformat(),
'scope': token_json.get('scope'),
'token_uri': token_url
}
if token_response.status_code != 200:
CustomValidations.raize_custom_error(
error_type="invalid",
loc="code",
msg="Failed to exchange token. Please provide a valid Google token.",
inp=str(data.code),
ctx={"code": "valid"},
)
if organization.gtoken is not None:
CustomValidations.raize_custom_error(
error_type="already_exist",
msg=f"token already exists in {organization.title}"
)
organization.gtoken = json.dumps(token_json)
sql.commit()
return {"organization": organization, "token": extracted_token}
当我在本地运行此代码时,令牌交换工作没有任何问题。但是,在服务器上,我收到以下错误消息:“无效的redirect_url”我不确定为什么这种不匹配仅在生产中发生。有没有人遇到过类似的问题或知道如何解决这个问题?任何帮助将不胜感激。
你遇到的问题是,你在生产环境中使用的 redirect_uri 与你在 Google Cloud Console 中为你的 OAuth 2.0 客户端配置的 redirect_uri 不匹配。
问题原因:
你在代码中将
REDIRECT_URL
硬编码为
http://localhost:3000
。 这是你本地开发环境的正确地址,但不是你生产环境的正确地址。当你将代码部署到服务器时,Google 会将你发送到
http://localhost:3000
,而这与你配置的授权 redirect_uri 不匹配,因此会出现
redirect_uri_mismatch
错误。
解决方案:
-
更新 Google Cloud Console 中的授权 redirect_uri:
-
登录 Google Cloud Console (https://console.cloud.google.com/)。
- 选择你的项目。
- 在左侧导航菜单中,选择 API 和服务 > 凭据 。
- 点击你用于此应用程序的 OAuth 2.0 客户端 ID。
-
在
授权 redirect_uri
部分中,添加你的生产环境的正确 redirect_uri。例如,如果你的应用程序托管在
https://example.com
,则应添加https://example.com/oauth2callback
或类似的 URL。 -
点击 保存 。
-
更新你的代码,使用环境变量或配置设置来动态设置
REDIRECT_URL
: -
不要将
REDIRECT_URL
硬编码在代码中,而是使用环境变量或配置文件来存储此值。这将使你能够轻松地在不同的环境(例如,本地、测试和生产)中使用不同的 redirect_uri。
```python import os
# 从环境变量中读取 REDIRECT_URL REDIRECT_URL = os.environ.get('GOOGLE_OAUTH_REDIRECT_URL')
# ... 你的代码 ... ```
-
确保你的 redirect_uri 符合 Google 的要求:
-
必须是有效的 URI(例如,
https://example.com/callback
)。 - 不能包含任何查询参数或片段标识符。
- 必须与你在 Google Cloud Console 中为你的 OAuth 2.0 客户端配置的授权 redirect_uri 完全匹配,包括协议(http 或 https)、主机名、端口号和路径。
其他建议:
- 使用安全的 redirect_uri(https)。
- 定期检查你的 Google Cloud Console 凭据,确保你的 redirect_uri 和其他设置是最新的。
通过按照上述步骤操作,你应该能够解决
redirect_uri_mismatch
错误,并在生产环境中成功进行 Google OAuth2 身份验证。