public function authenticate(Request $request)
{
$provider = new Slack(['clientId' => $this->slackClientId, 'clientSecret' => $this->slackClientSecret, 'redirectUri' => $this->router->generate('authenticate', [], RouterInterface::ABSOLUTE_URL)]);
if (!$request->query->has('code')) {
// If we don't have an authorization code then get one
$options = ['scope' => ['chat:write:bot', 'users:read']];
$authUrl = $provider->getAuthorizationUrl($options);
$this->session->set(self::STATE_SESSION_KEY, $provider->getState());
return new RedirectResponse($authUrl);
} elseif (empty($request->query->get('state')) || $request->query->get('state') !== $this->session->get(self::STATE_SESSION_KEY)) {
$this->session->remove(self::STATE_SESSION_KEY);
return new Response('Invalid states.', 401);
} else {
// Try to get an access token (using the authorization code grant)
$token = $provider->getAccessToken('authorization_code', ['code' => $request->query->get('code')]);
// Who Am I?
$test = new AuthTestPayload();
$response = $this->getApiClient($token)->send($test);
if ($response->isOk()) {
$this->session->set(self::TOKEN_SESSION_KEY, $token);
$this->session->set(self::USER_ID_SESSION_KEY, $response->getUserId());
return new RedirectResponse($this->router->generate('run'));
} else {
return new RedirectResponse($this->router->generate('homepage'));
}
}
}