使用Perl和Facebook::Graph进行Facebook身份验证

软件和网站与Facebook、Twitter和其他社交网络系统的基本集成,如今已成为企业的一项重要检验。根据您使用的软件或网站,您可能需要获取一些数据,发布帖子,创建事件,上传照片,或将一个或多个社交网络站点用作单一登录系统。本系列文章将向您展示如何使用Facebook::Graph在Facebook上完成这些操作。

本系列的第一篇文章将从使用Facebook作为身份验证机制开始。当然还有更简单的事情可以做,但这确实是人们希望实现的功能之一。在您进行任何操作之前,您需要有一个Facebook账户。然后注册您的应用程序(图1)。

注册Facebook应用程序 图1. 注册Facebook应用程序。

然后填写您新应用程序的“网站”部分(图2)。

注册应用程序的网站 图2. 注册您的应用程序网站。

在Facebook上注册应用程序会给您的应用程序提供一个唯一的标识符以及一个密钥。这允许您的应用程序与Facebook通信并使用其API。没有它,您几乎什么也做不了(除了屏幕抓取并抱有希望)。

现在您已经准备好开始创建您的应用程序了。我使用了Dancer web应用程序框架,但您可以使用您喜欢的任何框架。从基本的Dancer模块开始

package MyFacebook;

use strict;
use Dancer ':syntax';
use Facebook::Graph;

get '/' => sub {
  template 'home.tt'
};

true;

这足以给应用程序一个主页。下一步是强制用户登录,如果他们还没有的话

before sub {
    if (request->path_info !~ m{^/facebook}) {
        if (session->{access_token} eq '') {
            request->path_info('/facebook/login')
        }
    }
};

这段小小的Dancer魔法表示,如果路径不是/facebook并且用户没有将access_token附加到他们的会话中,则将他们重定向到我们的登录页面。说到我们的登录页面,现在就创建它

get '/facebook/login' => sub {
    my $fb = Facebook::Graph->new( config->{facebook} );
    redirect $fb->authorize->uri_as_string;
};

这会创建一个将用户重定向到Facebook并询问他们是否允许应用程序使用他们的基本Facebook信息的页面。该代码将配置信息传递给Facebook::Graph,因此请记住在Dancer的config.yml中添加一个部分来跟踪这些信息

facebook:
    postback: "http://www.madmongers.org/facebook/postback/"
    app_id: "XXXXXXXXXXXXXXXX"
    secret: "XXXXXXXXXXXXXXXXXXXXXXXXXXX"

记住,您在创建应用程序后从Facebook的开发者应用程序中获取app_id和密钥。postback告诉Facebook在用户授权后将其发送到何处。请注意,Facebook要求在URL的末尾加上斜线(/)。在Facebook准备好将帖子发送到URL后,是时候创建它了

get '/facebook/postback/' => sub {
    my $authorization_code = params->{code};
    my $fb                 = Facebook::Graph->new( config->{facebook} );

    $fb->request_access_token($authorization_code);
    session access_token => $fb->access_token;
    redirect '/';
};

注意:我知道它被称为postback,但出于某种原因,Facebook将其作为GET执行。

Facebook的postback传递一个授权码——类似于临时密码。使用该代码请求Facebook的访问令牌(类似于会话ID)。访问令牌允许您代表用户从Facebook请求信息,因此所有这些步骤本质上都是您的应用程序在Facebook上登录。然而,除非您将其存储以供将来再次使用,否则下一次请求Facebook将会使您注销。因此,示例将访问令牌推入Dancer会话中,以供将来使用,然后再将用户重定向回网站的首页。

注意:我们拥有的访问令牌只持续两小时。在那之后,您必须再次请求它。

现在您可以更新首页以包括一些来自Facebook的信息。用以下内容替换现有的首页

get '/' => sub {
    my $fb = Facebook::Graph->new( config->{facebook} );

    $fb->access_token(session->{access_token});

    my $response = $fb->query->find('me')->request;
    my $user     = $response->as_hashref;
    template 'home.tt', { name => $user->{name} }
};

此代码从会话中检索访问令牌,并使用它来获取有关当前用户的一些信息。它将用户名作为模板参数传递给主页模板,以便主页可以显示用户名。(您如何知道要请求什么以及会收到什么响应?请参阅Facebook Graph API文档。)

虽然将Facebook用作身份验证系统有一些技巧,但并不特别困难。请关注第二部分,我将向您展示如何向用户的墙发布内容。

标签

反馈

这篇文章有什么问题吗?请通过在GitHub上打开一个问题或pull request来帮助我们。