You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在expo-auth-session中实现Discord认证?遇URI验证错误

解决Expo Auth Session集成Discord认证时的"validation error auth url must be a valid uri"错误

以下是针对这个错误的具体排查和解决步骤:

1. 确认Discord授权端点配置正确

discord.authorize必须指向Discord官方OAuth2授权URL:https://discord.com/api/oauth2/authorize。如果你的discord对象是自定义的,务必检查该字段是否拼写正确、是否包含完整的https://协议头。

示例修正:

// 正确定义Discord配置
const discord = {
  authorize: 'https://discord.com/api/oauth2/authorize',
  clientId: '你的Discord客户端ID',
  scopes: ['identify', 'email'] // 按需选择Discord支持的权限
};

2. 检查重定向URI生成逻辑

使用makeRedirectUri时,若开启useProxy: true,需确保Expo开发服务器正常运行,代理能正常转发请求。针对裸机测试场景,可显式指定scheme(需与app.json中配置的scheme一致):

const redirectUri = makeRedirectUri({
  useProxy,
  scheme: 'your-app-scheme' // 替换为你在app.json中配置的scheme
});

同时,要在Discord开发者后台的重定向URI列表中添加对应地址:

  • 使用代理时:https://auth.expo.io/@你的Expo用户名/你的项目名
  • 裸机测试时:your-app-scheme://auth.expo.io/@你的Expo用户名/你的项目名

3. 修正Auth Request配置

确保scopes为字符串数组格式,且均为Discord支持的权限。另外,useAutoDiscovery依赖合法的授权端点获取OpenID配置,若端点错误会直接导致URL验证失败。

调整后的完整代码示例:

import { View, Button } from 'react-native';
import { useAuthRequest, useAutoDiscovery, makeRedirectUri } from 'expo-auth-session';
import { useEffect } from 'react';

const discord = {
  authorize: 'https://discord.com/api/oauth2/authorize',
  clientId: '你的Discord客户端ID',
  scopes: ['identify', 'email']
};

const useProxy = true;
const redirectUri = makeRedirectUri({ useProxy });

export default function Login() {
    const discovery = useAutoDiscovery(discord.authorize);
    const [request, response, promptAsync] = useAuthRequest(
        {
            clientId: discord.clientId,
            redirectUri,
            scopes: discord.scopes,
            responseType: 'code' // Discord默认支持code模式
        },
        discovery
    );

    useEffect(() => {
      if (response) {
        console.log('认证响应:', response);
        // 此处可添加token交换逻辑
      }
    }, [response]);

    const onLogin = async () => {
        if (!request) return;
        try {
            await promptAsync({ useProxy });
        } catch (e) {
            console.error('认证失败:', e);
        }
    };

    return (
        <View>
         <Button title="登录Discord" disabled={!request} onPress={onLogin} />
        </View>
    );
}

4. 额外排查点

  • 升级Expo CLI到最新版本,旧版本可能存在auth-session的已知bug,执行expo update即可升级。
  • 检查设备网络连接,确保能正常访问Discord的OAuth2服务端点。
  • 核对Discord开发者后台的客户端ID,确认没有复制错误。

内容的提问来源于stack exchange,提问作者qu tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:25:20