【问题标题】:Console apps and extended permission offline_access workflow控制台应用程序和扩展权限 offline_access 工作流程
【发布时间】:2011-05-31 22:27:01
【问题描述】:
我正在尝试让 Facebook C# SDK 与 offline_access 和控制台应用程序一起使用。
据我了解,我必须:
- 为 offline_access 请求授权 - 这很简单。
- 获取用户授权offline_access时FB返回的“code”
- 每次使用 ExchangeCodeForAccessToken 获取有效的访问令牌
我不知道如何获取 (2) 中的代码?
谢谢
【问题讨论】:
标签:
c#
facebook
oauth
facebook-c#-sdk
【解决方案1】:
如果您在服务器端工作流程中进行身份验证,通常会获取“代码”并将代码交换为令牌。在您的场景中,这可能是一个红鲱鱼。有更简单的方法可以直接获取访问令牌。
如果有更多的上下文(包括代码)来显示你是如何获得offline_access(javascript、服务器端OAuth,...?)
当您通过 Javascript SDK(我认为它提供了最佳用户体验)获得 offline_access 时,您将在 Facebook 的响应中取回访问令牌:
FB.login(function (response) {
if (response.session) {
if (response.perms) {
var accesstoken = response.session.access_token;
// do something with the token...save it, use it, etc.
} else {
// re-prompt for permissions
}
}
}, { perms: 'offline_access' });
一旦你在 javascript 中拥有它,你就可以将它填充到一个隐藏的表单字段中,将它放在一个 ajax 帖子中到你的服务器,或者其他任何东西。
请注意,根据我的经验,您实际上并不需要保存的用户访问令牌来为所有 api 方法执行离线 api 调用。在某些情况下,您可以只使用应用程序访问令牌,如果您拥有offline_access 和其他所需权限,Facebook 就会让它飞起来。他们确实在上周发布了一篇开发人员博客文章,指出您需要一个令牌来进行一些以前不需要的 api 调用,因此这可能会发生变化。
还要注意,这些令牌可能会变坏。例如,如果用户更改了他们的 Facebook 帐户密码,它会使所有访问令牌失效。所以最好对它们进行测试,捕获 OAuth 异常,并有办法让用户注意到这一点,以重新提示权限并获取新的访问令牌。
【解决方案2】:
在用户授予您“offline_access”权限后,Facebook 将使用“code”查询字符串参数将用户重定向到您的应用程序 URL。您需要获取此“代码”查询字符串参数。
然后,使用此“代码”值发出另一个 WebRequest 以获取访问令牌。使用以下 URL 发出请求:
https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}
WebResponse 可以这样解析:
NameValueCollection qs = HttpUtility.ParseQueryString(response);
token = qs["access_token"];
您需要将令牌保存在数据库中以便在控制台应用程序中使用。