Facebook OAuth认证异常:非开发用户跳转「功能不可用」页面求助
Facebook OAuth集成问题排查
我们已将Facebook OAuth集成至应用注册流程,用于验证新申请者身份并获取其社交平台信息存储审核,审核通过后方可授予应用全权限。
具体流程说明
前端授权链接
前端提供的Facebook授权链接:https://www.facebook.com/v22.0/dialog/oauth?client_id={our_id}&redirect_uri=https%3A%2F%2F{our_url}%2Foauth%2Ffacebook%2Fcallback&scope=email%2Cpublic_profile%2Cpages_show_list%2Cpages_read_engagement&state=${encodedState}
回调URL执行操作
授权成功后,回调URL依次执行以下操作:
- 通过code获取Facebook access token
public InstagramTokenResponse getFacebookAccessToken(String code, String redirectUrl) throws Exception { URI uri = new URI(String.format("https://graph.facebook.com" + "/v22.0/oauth/access_token?client_id=%s&redirect_uri=%s&client_secret=%s&code=%s", facebookClientId, redirectUrl, facebookClientSecret, code)); log.info("Getting facebook access token " + uri.toString()); return restTemplate.getForObject(uri, InstagramTokenResponse.class); }
- 使用access token获取用户详情
public FacebookUserDataResponse getFacebookUser(String accessToken) throws Exception { URI uri = new URI(String.format("https://graph.facebook.com" + "/v22.0/me?fields=id,name,email&access_token=%s", accessToken)); log.info("Getting facebook user " + uri.toString()); return restTemplate.getForObject(uri, FacebookUserDataResponse.class); }
- 获取Facebook页面数据估算粉丝数
try { facebookPagesResponse = oAuthServiceClient.getFacebookPages(facebookUserAccessToken); for (FacebookPage page : facebookPagesResponse.getData()) { String pageAccessToken = page.getAccess_token(); String pageId = page.getId(); FacebookPageDetails pageDetails = oAuthServiceClient.getFacebookPageDetails(pageId, pageAccessToken); followerCount += pageDetails.getFan_count(); } } catch (Exception e) { LOG.info("OAuth failed to get facebook pages or their information"); }
客户端获取Facebook页面及详情代码
public FacebookPagesResponse getFacebookPages(String accessToken) throws Exception { URI uri = new URI(String.format("https://graph.facebook.com" + "/me/accounts?access_token=%s", accessToken)); log.info("Getting facebook pages " + uri.toString()); return restTemplate.getForObject(uri, FacebookPagesResponse.class); } public FacebookPageDetails getFacebookPageDetails(String pageId, String pageAccessToken) throws Exception { URI uri = new URI(String.format("https://graph.facebook.com" + "/%s?fields=name,fan_count&access_token=%s", pageId, pageAccessToken)); log.info("Getting facebook page details " + uri.toString()); return restTemplate.getForObject(uri, FacebookPageDetails.class); }
当前问题与疑问
我们已获得pages_read_engagement和instagram_basic权限,应用已验证并上线。但非开发团队用户使用该流程时,始终无法完成认证,直接跳转至「Feature Unavailable」页面,从未进入回调URL。内部测试无此问题,猜测是否需要将应用转为Facebook商业类型应用?
内容的提问来源于stack exchange,提问作者Kristian Martinez
相关产品推荐
相关产品推荐

