Java Facebook访问令牌检索
你好 我正在尝试与facebook整合。因此,我需要用户使用facebook登录到我的网站,然后我需要获得他们的信息,如朋友列表等 我的工作如下:Java Facebook访问令牌检索,java,facebook,spring,model-view-controller,Java,Facebook,Spring,Model View Controller,你好 我正在尝试与facebook整合。因此,我需要用户使用facebook登录到我的网站,然后我需要获得他们的信息,如朋友列表等 我的工作如下: @RequestMapping("/login") public void facebookLogin(HttpServletRequest request, HttpServletResponse response,String code) throws Exception { // ModelAndView mod
@RequestMapping("/login")
public void facebookLogin(HttpServletRequest request, HttpServletResponse response,String code) throws Exception
{
// ModelAndView model = new ModelAndView();
// Facebook did not accept this user yet...
if(code==null||code.equalsIgnoreCase(""))
{
String facebook_url = "https://www.facebook.com/dialog/oauth?";
// facebook_url+="client_id="+ Settings.getStringSetting("app_id");
facebook_url+="client_id="+ "12849129...344";
facebook_url+="&scope=publish_actions,friends_hometown,friends_status,friends_birthday";
facebook_url+="&redirect_uri="+domain+ "/facebook/login";
facebook_url+="&state="+ "DDFFRREEiiFF";
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", facebook_url);
}
// Facebook accepted our user
else
{
// Getting token to use facebook API
String getTokenURL = "https://graph.facebook.com/oauth/access_token?"
+"client_id="+ "128491....344"
+"&redirect_uri="+domain+ "/facebook/login"
+"&code="+code
+"&scope=publish_actions,friends_hometown,friends_status,friends_birthday"
+"&client_secret="+"fc160e2ab...235254240c";
//friends_hometown
String result = HTTPClient.sendHTTPRequestWithMethod(getTokenURL, "GET");
String access_token = extractParams(result).get("access_token");
// Get user...
String get_user_url = "https://graph.facebook.com/me?access_token="+access_token;
String user_str = HTTPClient.sendHTTPSRequestWithMethod(get_user_url,"GET");
JSONProcessor proc = new JSONProcessor(user_str);
System.out.println(proc.getStructure());
HashMap<String,Object> user = proc.getStructure();
String facebook_id = proc.getStructure().get("id").toString();
DBRecord rec = dbProc.getUserByFacebookId(facebook_id);
User u = new User();
u.setValue("facebook_access_token",access_token);
u.setValue("facebook_id",facebook_id);
u.setValue("first_name",user.get("first_name"));
u.setValue("last_name",user.get("last_name"));
u.setValue("facebook_name",user.get("name"));
u.setValue("birthday",user.get("birthday"));
u.setValue("facebook_code",code);
u.setValue("facebook_link",user.get("link"));
u.setValue("gender",user.get("gender"));
u.setValue("facebook_photo_url","https://graph.facebook.com/"+user.get("id")+"/picture?type=small");
if(rec==null)
{
Long user_id = u.createInDB(dbProc);
u.setValue("id",user_id);
}
else
{
u.setValue("id",rec.getID());
u.saveToDB(dbProc);
}
setCookie(response,"facebook_code",code,86400000);
// return new ModelAndView("/user/main_choose");
response.setStatus(response.SC_MOVED_TEMPORARILY);
response.setHeader("Location", "/user/main_choose");
}
}
@RequestMapping(“/login”)
public void facebook登录(HttpServletRequest请求、HttpServletResponse响应、字符串代码)引发异常
{
//ModelAndView模型=新的ModelAndView();
//Facebook尚未接受此用户。。。
if(code==null | | code.equalsIgnoreCase(“”)
{
字符串facebook\u url=”https://www.facebook.com/dialog/oauth?";
//facebook_url+=“客户端_id=“+Settings.getStringSetting(“应用程序id”);
facebook_url+=“客户端_id=“+”12849129…344”;
facebook\u url+=“&scope=发布\u动作、好友\u家乡、好友\u状态、好友\u生日”;
facebook_url+=“&redirect_uri=“+domain+”/facebook/login”;
facebook_url+=“&state=“+”ddffrreeiff”;
response.setStatus(response.SC_临时移动);
setHeader(“位置”,facebook_url);
}
//Facebook接受了我们的用户
其他的
{
//获取令牌以使用facebook API
字符串getTokenURL=”https://graph.facebook.com/oauth/access_token?"
+“客户端id=“+”128491…344”
+“&redirect_uri=“+domain+”/facebook/login”
+“&code=“+code
+&scope=publish\u actions、friends\u home、friends\u status、friends\u生日
+“&client_secret=“+”fc160e2ab…235254240c”;
//家乡的朋友
字符串结果=HTTPClient.sendHTTPRequestWithMethod(getTokenURL,“GET”);
字符串访问令牌=提取参数(结果).get(“访问令牌”);
//获取用户。。。
字符串get\u user\u url=”https://graph.facebook.com/me?access_token=“+接入令牌;
字符串user_str=HTTPClient.sendHTTPSRequestWithMethod(get_user_url,“get”);
JSONProcessor proc=新的JSONProcessor(用户_str);
System.out.println(proc.getStructure());
HashMap user=proc.getStructure();
字符串facebook_id=proc.getStructure().get(“id”).toString();
DBRecord rec=dbProc.getUserByFacebookId(facebook_id);
用户u=新用户();
u、 setValue(“facebook_访问_令牌”,访问_令牌);
u、 setValue(“facebook\u id”,facebook\u id);
u、 setValue(“first_name”,user.get(“first_name”);
u、 setValue(“last_name”,user.get(“last_name”);
u、 setValue(“facebook_name”,user.get(“name”);
u、 setValue(“生日”,user.get(“生日”);
u、 设置值(“facebook_代码”,代码);
u、 setValue(“facebook_链接”,user.get(“链接”);
u、 setValue(“性别”,user.get(“性别”);
u、 setValue(“facebook\u照片\u url”https://graph.facebook.com/“+user.get(“id”)+”/picture?type=small”);
if(rec==null)
{
长用户_id=u.createInDB(dbProc);
u、 设置值(“id”,用户id);
}
其他的
{
u、 setValue(“id”,rec.getID());
u、 saveToDB(dbProc);
}
setCookie(回复,“facebook_代码”,代码86400000);
//返回新的ModelAndView(“/user/main_choose”);
response.setStatus(response.SC_临时移动);
response.setHeader(“Location”,“/user/main_choose”);
}
}
因此,我希望用户首先在没有代码参数的情况下访问/登录,然后我将他们重定向到https://www.facebook.com/dialog/oauth
然后他们将登录到facebook,它应该将他们重定向回/login,但添加“code”参数,然后我可以调用https://graph.facebook.com/oauth/access_token
使用该“code”参数检索当前用户的访问令牌。有了这个代币我就可以做我需要的一切了
所以,当我尝试从我的帐户(开发者帐户)登录时,一切正常。但当我尝试从其他帐户(例如我朋友的帐户)执行此操作时,我看到了facebook登录表单,但重定向后,我仍然没有“code”参数
为什么??
以下是我的应用程序配置:
网站URL:http://109.173.122.47/
画布URL:http://109.173.122.47/
Sabdbox模式:在上,
沙箱模式
是否已启用
如果
沙盒模式
是启用
你是唯一授权使用该应用程序的人,这不是对你问题的回答,但希望你知道可以为你处理/简化此问题的框架-例如,我建议你查看Spring社交项目