我目前正在使用PHP后端构建一个AngularJS应用程序。路由是使用Slim PHP完成的,我发现了一个AngularJs模块来进行基于令牌的身份验证。在后端的模块示例中,他们使用Laravel和一个名为GuzzleHttp \ Client()的客户端。现在,我不确定什么GuzzleHttp做Slim PHP没有(如果有的话),但我试图按照他们的例子,但我不想安装2个基本上可以做同样事情的框架。
所以我完成了路由,以便在向后端(auth / google)发出请求时,它会执行此操作:
public function google()
{
$app = \Slim\Slim::getInstance();
$request = $app->request()->getBody();
$body = json_decode($request);
$accessTokenUrl = 'https://accounts.google.com/o/oauth2/token';
$peopleApiUrl = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect';
$params = array(
'code' => $body->code,
'client_id' => $body->clientId,
'redirect_uri' => $body->redirectUri,
'grant_type' => 'authorization_code',
'client_secret' => GOOGLE_SECRET
);
$client = new GuzzleHttp\Client();
// Step 1. Exchange authorization code for access token.
$accessTokenResponse = $client->post($accessTokenUrl, ['body' => $params]);
$accessToken = $accessTokenResponse->json()['access_token'];
$headers = array('Authorization' => 'Bearer ' . $accessToken);
// Step 2. Retrieve profile information about the current user.
$profileResponse = $client->get($peopleApiUrl, ['headers' => $headers]);
$profile = $profileResponse->json();
// Step 3a. If user is already signed in then link accounts.
if (Request::header('Authorization'))
{
$user = User::where('google', '=', $profile['sub']);
if ($user->first())
{
return Response::json(array('message' => 'There is already a Google account that belongs to you'), 409);
}
$token = explode(' ', Request::header('Authorization'))[1];
$payloadObject = JWT::decode($token, Config::get('secrets.TOKEN_SECRET'));
$payload = json_decode(json_encode($payloadObject), true);
$user = User::find($payload['sub']);
$user->google = $profile['sub'];
$user->displayName = $user->displayName || $profile['name'];
$user->save();
return Response::json(array('token' => $this->createToken($user)));
}
// Step 3b. Create a new user account or return an existing one.
else
{
$user = User::where('google', '=', $profile['sub']);
if ($user->first())
{
return Response::json(array('token' => $this->createToken($user->first())));
}
$user = new User;
$user->google = $profile['sub'];
$user->displayName = $profile['name'];
$user->save();
return Response::json(array('token' => $this->createToken($user)));
}
}
现在这不起作用,因为我没有安装GuzzleHttp,但我的问题是:我可以在Slim PHP中执行此操作,还是需要GuzzleHttp来补充它?
答案 0 :(得分:2)
Guzzle是一个基于代码的HTTP客户端软件包/框架,它还包含DOM抓取功能,而不是微框架,因此它与Slim不相似。
从他们的自述文件:
Guzzle是一个PHP HTTP客户端,可以轻松发送HTTP请求,并且可以轻松地与Web服务集成。
Slim不直接提供此功能,因为它不属于Slim的意图,它将HTTP请求转换为HTTP响应(以及需要在其间发生的核心事物)。
由于你的例子是在Guzzle并且它实现了你想要做的事情,我可能会使用Guzzle。但是,您可以使用cURL
,ext/http
或其他HTTP客户端程序包执行相同类型的事务(即与外部Web服务交互)。有几个。
答案 1 :(得分:0)
Slim是一个微框架,它基本上提供来自应用程序的客户端请求和响应。这意味着Slim会响应请求,例如,它不会向外部HTTP发出请求。 Slim的想法是提供路线,在它到来时做一些事情并响应客户。 如果您需要使用外部呼叫,则需要使用任何HTTP客户端,它将提供“响应”请求和威胁的“能力”。你可以原生使用curl(所有其他的只是卷曲的“接口”)或lib。
答案 2 :(得分:0)
Slim和Guzzle有很多共同点,即它们都处理psr-7请求和响应
有一个主要区别 Slim处理请求和发送响应 Guzzle处理发送请求和处理响应
因此它们是不可互换的,并且处理通信管道的相反端
因此,如果您的处理要求某人已发送给您,则您需要苗条或类似的东西 如果您要向其他人发送请求,那么您需要精打细算或类似