我一直在更新Laravel 5.4网站,该网站必须很快投入生产。该站点将Azure AD身份验证用于自定义的书面单点登录机制。在没有任何代理的互联网环境下的开发环境中,这很好用。不幸的是,UAT和生产服务器位于导致问题的代理后面。身份验证所基于的代码基于Microsoft Graph API REST php示例。
第一部分如下所述,使用“ phpleague” OAuth2客户端从Microsoft检索令牌
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => config('app.client_id'),
'clientSecret' => config('app.client_secret'),
'redirectUri' => 'https://egmbank.local/oauth',
'urlAuthorize' => 'https://login.microsoftonline.com/'.config('app.tenant_id').'/oauth2/v2.0/authorize',
'urlAccessToken' => 'https://login.microsoftonline.com/'.config('app.tenant_id').'/oauth2/v2.0/token',
'urlResourceOwnerDetails' => '',
'scopes' => 'openid mail.send'
]);
if (!$request->has('code')) {
return redirect($provider->getAuthorizationUrl());
} else {
try {
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $request->input('code')
]);
} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
// Failed to get the access token
exit($e->getMessage());
}
}
// The "me" endpoint should return the information about the signed in user
$client = new Client();
$response = $client->request('GET', 'https://graph.microsoft.com/v1.0/me', [
'headers' => [
'Authorization' => 'Bearer ' . $accessToken->getToken(),
'Content-Type' => 'application/json;odata.metadata=minimal;odata.streaming=true'
]
]);
$me = json_decode($response->getBody()->getContents());
// This is the name to display in the header of each page
$displayName = $me->displayName;
如上所述,当不在代理后面时,这可以很好地工作,我得到了返回的令牌,然后可以进一步调用以从AD获取用户和组详细信息。
我看过联赛的OAuth2文档,这样它也是代码,它表明只需添加即可使用代理
'proxy' => 'proxy_name',
'verify' => false
到用于构建提供程序的参数列表。我已经捆绑了这个请求,但请求仍然被阻止。该文档确实说我必须“确保您在代理中启用SSL代理”。我检查了网络人员,他们认为“我们绕过了这些Microsoft网站的SSL加密”,对此无可奈何。
我查看了fideloper / TrustedProxies软件包,发现文档很难遵循,尤其是对于Laravel 5.4网站。
我已经将SSH连接到UAT服务器,并在命令提示符下设置了http_proxy,并且运行以下命令没有问题
curl -v https://login.microsoftonline.com:443
curl -v microsoft.com
所以当我告诉UAT服务器使用代理时,似乎可以通过代理。我本以为会有一种方法可以轻松地使Laravel项目对所有网络流量使用代理。
在这一点上,我感到很沮丧,如果能帮助该项目使用代理,不胜感激