Twitter登录Callback URL not approved for this client application错误记录

因为做的APP是面向海外版,这两天突然说Twitter登录失败,查了各种原因和解决方案,最终解决,并提供两种解决方案。

Twitter大佬更新授权认证机制,应用后台没有更新过来,导致大面积登录出问题,很崩!

问题描述

如果手机安装Twitter客户端,无影响,如果未安装,则提示登录失败,不能登录。

二话不说,连上手机看日志:

06-15 16:22:25.734 1015-1015/com.example.testlogin E/Twitter: Invalid json: <?xml version="1.0" encoding="UTF-8"?><errors><error code="415">Callback URL not approved for this client application. Approved callback URLs can be adjusted in your application settings</error></errors>
                                                              com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
                                                                  at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:224)
                                                                  at com.twitter.sdk.android.core.models.SafeListAdapter$1.read(SafeListAdapter.java:45)
                                                                  at com.twitter.sdk.android.core.models.SafeMapAdapter$1.read(SafeMapAdapter.java:45)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:887)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:852)
                                                                  at com.google.gson.Gson.fromJson(Gson.java:801)
你遇到的错误: ``` invalid_request: The provided value for the input parameter 'redirect_uri' is not valid. The expected value is a URI which matches a redirect URI registered for this client application. ``` 这是在使用 **Microsoft Identity Platform(Azure AD / Entra ID)** 进行 OAuth2 登录时常见的配置错误。 --- ## ✅ 错误原因 > 你请求 token 时传入的 `redirect_uri` 参数,**没有在 Azure AD 应用注册中提前声明和允许**。 Azure AD 要求: - 所有用于登录回调的 URL 必须 **预先注册在应用的“重定向 URI”列表中** - 并且必须 **完全匹配**(包括协议、主机、端口、路径) 否则就会报这个错。 --- ## 🔍 示例场景 假设你在代码中写了: ```python redirect_uri = "http://localhost:8000/callback" ``` 但你在 [Azure 门户](https://portal.azure.com) 注册应用时只添加了: ``` https://localhost:5000/login/authorized ``` → 协议、端口、路径都不一致 → ❌ 匹配失败 → 报错! --- ## ✅ 正确解决方案 ### ✅ 步骤 1:进入 Azure 门户注册你的 `redirect_uri` 1. 打开 [https://portal.azure.com](https://portal.azure.com) 2. 搜索并进入 **"Azure Active Directory" (Entra ID)** 3. 点击 **"App registrations"(应用注册)** 4. 找到你正在使用的应用(如 `my-python-app`) 5. 点击 **"Authentication"(认证)** 6. 在 **"Redirect URIs"** 区域点击 **"Add URI"** 7. 输入你代码中使用的完整地址,例如: ``` http://localhost:8000/callback ``` 8. 点击保存 📌 支持的常见开发用 `redirect_uri`: - `http://localhost:5000/callback` - `http://localhost:8000/login/authorized` - `http://127.0.0.1:8000/auth/callback` - 对于 MSAL CLI 工具:`http://localhost` > ⚠️ 注意: > - 必须带协议(`http://` 或 `https://`) > - 不支持通配符如 `http://*:*` > - 生产环境建议使用 HTTPS --- ### ✅ 步骤 2:确保代码中的 `redirect_uri` 完全一致 ```python # Python 示例(使用 msal 库) from msal import PublicClientApplication CLIENT_ID = "your-client-id" AUTHORITY = "https://login.microsoftonline.com/common" # 或你的 tenant ID SCOPES = ["Mail.Send"] app = PublicClientApplication( CLIENT_ID, authority=AUTHORITY, ) # 必须与 Azure 中注册的一模一样! redirect_uri = "http://localhost:8000/callback" # 开始授权流程 flow = app.initiate_auth_code_flow(scopes=SCOPES, redirect_uri=redirect_uri) print(flow["auth_uri"]) # 让用户访问这个链接 ``` 如果你写的是 Web 框架(Flask/Django/FastAPI),确保回调路由接收该 URI。 --- ### ✅ 步骤 3:推荐用于本地开发的标准配置 | 场景 | 推荐 `redirect_uri` | |------|---------------------| | 本地测试(通用) | `http://localhost` | | Flask 默认端口 | `http://localhost:5000/login/authorized` | | FastAPI + uvicorn | `http://localhost:8000/callback` | | 命令行工具 | `http://localhost` | > ✅ 微软官方建议:命令行或桌面应用可使用 `http://localhost`,因为它被默认信任。 --- ## 🧪 验证是否生效的方法 1. 打开生成的 `auth_uri`(类似下面这个): ``` https://login.microsoftonline.com/common/oauth2/v2.0/authorize? response_type=code& client_id=xxx& redirect_uri=http%3A%2F%2Flocalhost%3A8000%2Fcallback& scope=Mail.Send ``` 2. 如果页面正常跳转并要求登录 → 成功 3. 如果仍报错 `redirect_uri` 无效 → 回去检查拼写、编码、是否已保存 --- ## ❌ 常见错误写法(请避免) | ❌ 错误示例 | 🛑 问题 | |-----------|--------| | `/callback` | 缺少协议和主机 | | `localhost:8000/callback` | 缺少 `http://` | | `http://127.0.0.1:8000/callback` | 和注册的 `localhost` 不等价(DNS 解析不同) | | `http://localhost:8000/` | 路径不匹配(注册的是 `/callback`) | > 💡 提示:`localhost` 和 `127.0.0.1` 在某些安全策略下被视为不同主机! --- ## ✅ 最佳实践建议 1. **统一使用 `http://localhost:<port>/callback`** 作为开发标准 2. 在 Azure AD 中注册多个常用开发地址(如 5000、8000 端口) 3. 使用 `.env` 文件管理配置: ```env CLIENT_ID=your_client_id REDIRECT_URI=http://localhost:8000/callback TENANT_ID=common ``` 4. 使用 `msal.oauth2cli` 调试授权流程(适合学习) --- ## ✅ 总结 | 问题 | 解决方案 | |------|----------| | `redirect_uri is not valid` | 必须在 Azure AD 中预先注册 | | 匹配失败 | 必须协议、域名、端口、路径全部一致 | | 本地开发推荐值 | `http://localhost` 或 `http://localhost:8000/callback` | | 生产环境 | 使用 HTTPS,如 `https://yourdomain.com/auth/callback` | --- ###
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值