Symfony3 Facebook登录 - redirect_uri URL转换为相对

时间:2016-11-10 21:15:17

标签: php facebook-php-sdk symfony facebook-login

我正在尝试为网络应用实施facebook登录。 这是FacebookConnect.php

<?php
namespace Vendor\GiftBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Generator\UrlGenerator;

class FacebookConnectController extends Controller
{
    /**
     * @Route("/connect/facebook", name="connect_facebook")
     */
    public function connectFacebookAction(Request $request)
    {

        // redirect to Facebook
        $redir = $this->generateUrl('connect_facebook_check', array(), UrlGeneratorInterface::ABSOLUTE_URL);
        $facebookOAuthProvider = $this->get('app.facebook_provider');
        $url = $facebookOAuthProvider->getAuthorizationUrl([
            // these are actually the default scopes
            'scopes' => ['public_profile', 'email'],
            'redirect_uri' => [$redir],
        ]);
        return $this->redirect($url);
    }
    /**
     * @Route("/connect/facebook-check", name="connect_facebook_check")
     */
    public function connectFacebookActionCheck()
    {
        // will not be reached!
    }
}

当我点击触发connectFacebookAction函数的按钮时,我得到FB错误 redirect_uri URL必须是绝对的。它就像忽略了我在参数中给出的绝对URL。

我做错了什么?

编辑:授权网址在任何情况下都会发生变化,还是应用程序保持不变?我可以直接硬编码,直到找出解决方法吗?

EDIT2 :我弄清楚了为什么网址是相对的而不是绝对的。 这是我的服务配置:

services:
    app.facebook_provider:
        class: League\OAuth2\Client\Provider\Facebook
        arguments:
            -
                clientId: %facebook_app_id%
                clientSecret: %facebook_app_secret%
                graphApiVersion: v2.8
                redirectUri: "@=service('router').generate('connect_facebook_check', {}, true)"

如何从服务中的路线生成绝对URL?

2 个答案:

答案 0 :(得分:1)

您使用的是联盟/ oauth2-client的1.x版本(您可以登录composer.lock)吗?那个ignores the redirect_uri in getAuthorizationUrl并使用你在构造函数中传递的那个。如果您正在使用该版本,请将app.facebook_provider的定义更改为

redirectUri: "@=service('router').generate('connect_facebook_check', {}, 0)"

注意0而不是true。 The UrlGeneratorInterface constants have changed in 2.8

答案 1 :(得分:-1)

我认为您的问题是您在服务中缺少请求上下文。看一下: http://symfony.com/doc/current/console/request_context.html

您可以将请求传递给它,然后执行以下操作:

$context = new RequestContext();
$context->fromRequest($this->requestStack->getCurrentRequest());
$this->router->setContext($context);
$this->router->generate('connect_facebook_check', array(), RouterInterface::ABSOLUTE_URL);