Facebook服务器端身份验证流程:这是正确的吗;代码?“;
我在JS客户端上使用FB.login,希望在服务器上验证用户的身份。因此,客户端从facebook获得signedRequest并将其发送到服务器。服务器在句点上拆分,并将signedRequest的第二部分解码为json对象 当我将服务器端请求发送到时,“代码”应该使用什么Facebook服务器端身份验证流程:这是正确的吗;代码?“;,facebook,Facebook,我在JS客户端上使用FB.login,希望在服务器上验证用户的身份。因此,客户端从facebook获得signedRequest并将其发送到服务器。服务器在句点上拆分,并将signedRequest的第二部分解码为json对象 当我将服务器端请求发送到时,“代码”应该使用什么 https://graph.facebook.com/oauth/access_token? client_id=YOUR_APP_ID &redirect_uri=YOUR_REDIRECT_URI
https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID
&redirect_uri=YOUR_REDIRECT_URI
&client_secret=YOUR_APP_SECRET
&code=CODE_GENERATED_BY_FACEBOOK
我的解码json看起来像:
{"algorithm":"HMAC-SHA256","code":"2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g","issued_at":1335642445,"user_id":"5232286"}
这就是我需要的密码吗?它需要B64编码吗?如果这不是代码,我应该使用什么代码
_
我所尝试的:
我尝试使用的请求是:
https://graph.facebook.com/oauth/access_token?client_id=295410083869479&redirect_uri=https://squaredme.appspot.com/facebookredirect&client_secret=44f1TOPSECRETbb8e&code=2.AQCPA_yfx4JHpufjP.3600.1335646800.1-5702286|l11asGeDQTMo3MrMx3SC0PksALj6g
但这会返回错误:
{"error":{"message":"Error validating verification code.","type":"OAuthException","code":100}}
我不知道这是因为我使用了错误的代码还是什么。值得注意的是,这是在我的本地开发服务器上运行的,squaredme.appspot.com肯定不会解析到我的IP。我不知道facebook是否会检查这一点,我想我会得到一条更好的错误消息。谢谢你的指点 您试图以某种方式将这两个流组合在一起,这就是为什么事情不能很好地工作 当facebook使用你的应用程序url和签名请求发布到iframe时,有两个选项,简单的一个是用户已经通过身份验证,然后签名请求将拥有所有必要的数据(包括签名请求),然后你只需加载画布页面并使用JS SDK在那里获取访问令牌,但是在这种情况下,不需要使用FB.login(因为它会打开一个弹出窗口并自动关闭),您可以使用不会打扰用户的方法 如果用户未经过身份验证,那么签名请求将丢失使用graph api所需的内容。 然后,您将用户重定向到,由于您是在iframe中加载的,因此需要返回一个html响应,该响应使用javascript重定向父窗口,如:
top.location.href = "AUTH_DIALOG_URL";
当使用完成(接受或拒绝应用程序)后,他将被重定向到您作为参数添加到auth对话框的“redirect_uri”。
如果用户接受了您的应用程序,那么您将在查询字符串中获得“code”参数。
然后,您获取代码,在问题中发布时与访问令牌交换,然后将用户重定向回“apps.facebook.com/your_APP”
当页面加载时,用户已经通过身份验证,您将得到一个完全签名的请求
我希望这能为您澄清问题,重新检查流程,它几乎涵盖了所有内容。您试图以某种方式将这两个流程结合在一起,这就是为什么事情不能很好地工作的原因 当facebook使用你的应用程序url和签名请求发布到iframe时,有两个选项,简单的一个是用户已经通过身份验证,然后签名请求将拥有所有必要的数据(包括签名请求),然后你只需加载画布页面并使用JS SDK在那里获取访问令牌,但是在这种情况下,不需要使用FB.login(因为它会打开一个弹出窗口并自动关闭),您可以使用不会打扰用户的方法 如果用户未经过身份验证,那么签名请求将丢失使用graph api所需的内容。 然后,您将用户重定向到,由于您是在iframe中加载的,因此需要返回一个html响应,该响应使用javascript重定向父窗口,如:
top.location.href = "AUTH_DIALOG_URL";
当使用完成(接受或拒绝应用程序)后,他将被重定向到您作为参数添加到auth对话框的“redirect_uri”。
如果用户接受了您的应用程序,那么您将在查询字符串中获得“code”参数。
然后,您获取代码,在问题中发布时与访问令牌交换,然后将用户重定向回“apps.facebook.com/your_APP”
当页面加载时,用户已经通过身份验证,您将得到一个完全签名的请求
我希望这能为您澄清问题,重新检查一下,它几乎涵盖了所有内容。我也遇到了一些问题,然后我在StackOverflow中找到了解决方案。 facebook提供了两种“代码”。一个位于客户端流生成的cookie中的signedRequest内部。Facebook的JSSDK处理这些代码,并在不告诉我们任何信息的情况下获取访问令牌 另一种类型的代码作为查询附加到重定向URI(http://www.yoururl.com/index.php?code=AAAgyiaus...),当您导航到OAuth URL(服务器端流)时。使用此代码,您可以转到令牌URL并获取访问令牌 当您使用服务器端流时,需要在OAuth URL和令牌URL中指示重定向URI,并且它们必须完全相同,因此缺少斜杠或查询字符串可能会有很多问题 这些代码彼此不同。当您同时使用这两种方法时,似乎不可能使用cookie的signedRequest中的代码获取访问令牌 但事实并非如此。神奇的是:signedRequest中的代码没有与URI关联,因此只要redirect_URI是一个必填字段,您所要做的就是在导航到令牌URL时将其传递为空 因此,最终的解决方案是:从cookie中获取signedRequest,在服务器中解析它以获得代码,然后读取令牌URL:
它看起来像黑客,所以我不知道它能工作多久,但它现在正在工作 我也遇到了一些问题,然后我在StackOverflow中找到了解决方案。 facebook提供了两种“代码”。一个位于客户端流生成的cookie中的signedRequest内部。Facebook的JSSDK处理这些代码,并在不告诉我们任何信息的情况下获取访问令牌 另一种类型的代码作为查询附加到重定向URI(http://www.yoururl.com/index.php?code=AAAgyiaus...),当您导航到OAuth URL(服务器端流)时。使用此代码,您可以转到令牌URL并获取您的