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

Facebook Graph API访问令牌未包含scope指定权限求助

Facebook登录权限pages_show_list未被授予排查问题

我正在使用Next.js开发一款用户主页帖子调度应用,用于测试的账号已设置为应用的Tester角色,理论上权限不应存在问题。但在Facebook登录按钮的scope参数中添加pages_show_list权限后,生成的短期和长期访问令牌均未包含该权限,仅默认授予public_profile权限。我通过Node.js脚本验证令牌权限,返回结果如下:

Data: { data: [ { permission: 'public_profile', status: 'granted' } ] }

我预期至少能看到该权限的记录(无论状态是否为granted),恳请协助排查问题。相关代码如下:

Facebook异步初始化代码

useEffect(() => {
        window.fbAsyncInit = function () {
            // @ts-ignore
            FB.init({
                appId: process.env.NEXT_PUBLIC_FACEBOOK_APP_ID,
                cookie: true,
                xfbml: true,
                version: process.env.NEXT_PUBLIC_FACEBOOK_API_VERSION, // v20.0
            });

            // @ts-ignore
            FB.AppEvents.logPageView();

            // @ts-ignore
            FB.getLoginStatus(function (response) {
                console.log('login status:', response)
            });
        };

        (function (d, s, id) {
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) { return; }
            js = d.createElement(s); js.id = id;
            // @ts-ignore
            js.src = "https://connect.facebook.net/en_US/sdk.js";
            // @ts-ignore
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));
    }, []);

登录按钮点击事件处理函数

const loginWithShowListPerm = () => {
        // @ts-ignore
        FB.login(function (response) {
            (async () => {
                console.log('login response:', response)
                if (response.status === 'connected') {
                    const params: GraphApiParams = {
                        accessToken: response.authResponse.accessToken,
                        platformUserId: response.authResponse.userID,
                    }

                    await saveAccessToken(params);

                    const accessTokenData = await getAccessTokenData(params);

                    console.log('accessTokenData:', accessTokenData);


                    // User is logged in and authorized
                    // Execute your function here
                }
            })();
        }, { scope: 'pages_show_list' });

转换为长期访问令牌的后端方法(由saveAccessToken服务端动作调用)

export async function convertToLongLivedAccessToken({
    userAccessToken,
}: {
    userAccessToken: string,
}) {
    try {
        const response = await fetch(`https://graph.facebook.com/${process.env.NEXT_PUBLIC_FACEBOOK_API_VERSION}/oauth/access_token`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                grant_type: 'fb_exchange_token',
                client_id: process.env.NEXT_PUBLIC_FACEBOOK_APP_ID,
                client_secret: process.env.FACEBOOK_APP_SECRET,
                fb_exchange_token: userAccessToken,
            }),
        });

        const data = await response.json();
        console.log('data:', data);
        return data.access_token;
    } catch (error) {
        console.error('Error converting to Long Lived Access Token:', error);
        return null;
    }
}

检查令牌权限的Node.js脚本

async function main() {
try {
const response = await fetch(`https://graph.facebook.com/v20.0/me/permissions?access_token=${accessToken}`);

        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
    
        const data = await response.json();
    
        console.log('Data:', data);
    
    } catch (error) {
        console.error('Error fetching user permissions:', error);
    }

}

main();

内容的提问来源于stack exchange,提问作者Rik Puts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:50:12