getSignedRequest()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Copyright 2016 Facebook, Inc.
4
 *
5
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
6
 * use, copy, modify, and distribute this software in source code or binary
7
 * form for use in connection with the web services and APIs provided by
8
 * Facebook.
9
 *
10
 * As with any software that integrates with the Facebook platform, your use
11
 * of this software is subject to the Facebook Developer Principles and
12
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
13
 * shall be included in all copies or substantial portions of the software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
22
 *
23
 */
24
namespace Facebook\Helpers;
25
26
use Facebook\Facebook;
27
use Facebook\FacebookApp;
28
use Facebook\FacebookClient;
29
use Facebook\SignedRequest;
30
use Facebook\Authentication\AccessToken;
31
use Facebook\Authentication\OAuth2Client;
32
33
/**
34
 * Class FacebookSignedRequestFromInputHelper
35
 *
36
 * @package Facebook
37
 */
38
abstract class FacebookSignedRequestFromInputHelper
39
{
40
    /**
41
     * @var SignedRequest|null The SignedRequest entity.
42
     */
43
    protected $signedRequest;
44
45
    /**
46
     * @var FacebookApp The FacebookApp entity.
47
     */
48
    protected $app;
49
50
    /**
51
     * @var OAuth2Client The OAuth 2.0 client service.
52
     */
53
    protected $oAuth2Client;
54
55
    /**
56
     * Initialize the helper and process available signed request data.
57
     *
58
     * @param FacebookApp    $app          The FacebookApp entity.
59
     * @param FacebookClient $client       The client to make HTTP requests.
60
     * @param string|null    $graphVersion The version of Graph to use.
61
     */
62
    public function __construct(FacebookApp $app, FacebookClient $client, $graphVersion = null)
63
    {
64
        $this->app = $app;
65
        $graphVersion = $graphVersion ?: Facebook::DEFAULT_GRAPH_VERSION;
66
        $this->oAuth2Client = new OAuth2Client($this->app, $client, $graphVersion);
67
68
        $this->instantiateSignedRequest();
69
    }
70
71
    /**
72
     * Instantiates a new SignedRequest entity.
73
     *
74
     * @param string|null
75
     */
76
    public function instantiateSignedRequest($rawSignedRequest = null)
77
    {
78
        $rawSignedRequest = $rawSignedRequest ?: $this->getRawSignedRequest();
79
80
        if (!$rawSignedRequest) {
81
            return;
82
        }
83
84
        $this->signedRequest = new SignedRequest($this->app, $rawSignedRequest);
85
    }
86
87
    /**
88
     * Returns an AccessToken entity from the signed request.
89
     *
90
     * @return AccessToken|null
91
     *
92
     * @throws \Facebook\Exceptions\FacebookSDKException
93
     */
94
    public function getAccessToken()
95
    {
96
        if ($this->signedRequest && $this->signedRequest->hasOAuthData()) {
97
            $code = $this->signedRequest->get('code');
98
            $accessToken = $this->signedRequest->get('oauth_token');
99
100
            if ($code && !$accessToken) {
101
                return $this->oAuth2Client->getAccessTokenFromCode($code);
102
            }
103
104
            $expiresAt = $this->signedRequest->get('expires', 0);
105
106
            return new AccessToken($accessToken, $expiresAt);
107
        }
108
109
        return null;
110
    }
111
112
    /**
113
     * Returns the SignedRequest entity.
114
     *
115
     * @return SignedRequest|null
116
     */
117
    public function getSignedRequest()
118
    {
119
        return $this->signedRequest;
120
    }
121
122
    /**
123
     * Returns the user_id if available.
124
     *
125
     * @return string|null
126
     */
127
    public function getUserId()
128
    {
129
        return $this->signedRequest ? $this->signedRequest->getUserId() : null;
130
    }
131
132
    /**
133
     * Get raw signed request from input.
134
     *
135
     * @return string|null
136
     */
137
    abstract public function getRawSignedRequest();
138
139
    /**
140
     * Get raw signed request from POST input.
141
     *
142
     * @return string|null
143
     */
144
    public function getRawSignedRequestFromPost()
0 ignored issues
show
Coding Style introduced by
getRawSignedRequestFromPost uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
145
    {
146
        if (isset($_POST['signed_request'])) {
147
            return $_POST['signed_request'];
148
        }
149
150
        return null;
151
    }
152
153
    /**
154
     * Get raw signed request from cookie set from the Javascript SDK.
155
     *
156
     * @return string|null
157
     */
158
    public function getRawSignedRequestFromCookie()
0 ignored issues
show
Coding Style introduced by
getRawSignedRequestFromCookie uses the super-global variable $_COOKIE which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
159
    {
160
        if (isset($_COOKIE['fbsr_' . $this->app->getId()])) {
161
            return $_COOKIE['fbsr_' . $this->app->getId()];
162
        }
163
164
        return null;
165
    }
166
}
167