未通过所需选项:" access_token"

时间:2017-10-26 12:16:40

标签: php laravel microsoft-graph

我正在使用Graph API,用户可以通过他们的Microsoft帐户登录。我关注Get started with Microsoft Graph in a PHP app 制品

现在我对Laravel并不陌生,但我似乎无法弄清楚这个问题。我正在使用League OAuth2 Package。根据上面的链接,我应该在我建立连接之前获得访问令牌。现在,我自己做了大量的调试,以下是我找到的。

 $token = $this->createAccessToken($prepared, $grant);

当它尝试创建令牌时,它会在此之前检查access_token是否存在。现在我的理解是,access_token将从此方法生成。那它怎么可能已经存在。有人可以帮我这个吗?

这是我的路线代码:

Route::get('/oauth', function (Request $request) {
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => 'client_id',
    'clientSecret'            => 'secret_key',
    'redirectUri'             => 'http://localhost:8000/oauth',
    'urlAuthorize'            => 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
    'urlAccessToken'          => 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
    'urlResourceOwnerDetails' => '',
    'scopes'                  => 'openid'
]);

if (!$request->has('code')) {
    return redirect($provider->getAuthorizationUrl());
} else {
    $accessToken = $provider->getAccessToken('authorization_code', [
        'code'     => $request->input('code')
    ]);
    exit($accessToken->getToken());
}
});

感谢。

更新

现在我正在制作像这样的CURL请求

    $url = 'https://login.microsoftonline.com/common/oauth2/v2.0/token';
    $data  =  'grant_type=authorization_code';
    $data .=  '&code=' . $request->input('code');
    $data .=  '&client_id=id_here';
    $data .=  '&client_secret=secret_here';
    $data .=  '&redirect_uri=http://localhost:8000/oauth';
    $data .=  '&scopes=openid user.read';
    $additional_headers = array(
        'Content-Type' => 'application/x-www-form-urlencoded'
    );
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $additional_headers);
    $server_output = curl_exec ($ch);
    dd($server_output);

但是,此CURL请求的输出/响应被赋予' token_id'宾语。而不是access_token& expiry_in ...

1 个答案:

答案 0 :(得分:0)

您不创建访问令牌,您可以通过身份验证提供程序(在本例中为Microsoft)提供。

使用authorization_code流程,您在技术上会收到验证码。然后,您将Auth Code提交回服务器,以将其交换为访问令牌。然后,将调用的Authorization标头中的Access Token传递给Microsoft Graph API。

我在v2端点上有一个入门知识,它将引导您了解OAUTH过程如何与您可能会发现有用的授权码流一起工作:Microsoft v2 endpoint primer

更新:

您无法使用curl之类的工具来执行授权码授权。对/authorize的第一次调用是GET,导致用户登录的网页。完成后,身份验证提供程序会将用户重定向回您的Web服务器,然后将POST发送到/token端点。

如果要使用curl(或任何其他客户端脚本),则需要使用隐式授权。我也有类似的步骤:v2 Endpoint and Implicit Grant