NodeJS 尝试刷新令牌时出现invalid_grant错误

xwmevbvl  于 2023-05-28  发布在  Node.js
关注(0)|答案(2)|浏览(200)

我正在开发一个node.js应用程序,它使用outlook rest API来获取邮件。使用this API。
我正在尝试使用以下请求刷新令牌。我正在使用request npm调用API

{
    url: 'https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token',
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    formData:
    {
        scope: 'offline_access User.Read Mail.Read',
        client_id: 'c251b61b-c6db-4f64-89bd-7009444d1bc8',
        grant_type: 'refresh_token',
        redirect_uri: 'http://localhost:3000/myurl',
        refresh_token: 'refresh-token',
        client_secret: 'cli-secret'
     }
}

但得到以下错误

{
  "error": "invalid_grant",
  "error_description": "AADSTS9002313: Invalid request. Request is malformed or  invalid.745ec0500",
  "correlation_id": "a2d87f11-0671-41f1-a5e7-654f1796c3d1"
}

我还尝试在头文件中添加Content-length,并使用&=将所有变量追加到字符串中,然后在正文中发送,但我得到了相同的错误。我成功得到了一个access-token

vnzz0bqm

vnzz0bqm1#

到目前为止,我知道你试图以错误的方式获得刷新令牌。
正如错误所说,您正在尝试输入不正确的grant_type
根据您给定的文档参考,grant_type应该是authorization_code。一旦你得到了你的Code,那么你需要使用它来实现access tokenrefresh token
当您的访问令牌将过期,那么你必须使用刷新令牌,以获得一个新的访问令牌,如文件解释。
在这种情况下,尝试使用response_type=code

申请编码:

在Postman控制台获取代码:

请求访问和刷新令牌,代码:

获取访问和刷新令牌的编码:

访问令牌过期获取刷新令牌:

**注意:**这是您获得authorization code的确切方式,以及如何使用此代码获得access token沿着refresh token,最后如何在access token到期时使用refresh token续订令牌!

svgewumm

svgewumm2#

当您第一次生成访问令牌时,您还将获得刷新令牌。您必须将该令牌存储在任何地方,也可以将其存储在数据库或txt文件中。

$post_params_refresh = array(
"grant_type" => "refresh_token",
"client_id" => 'ReplaceYourClientId',
"refresh_token" => 'ReplaceYourOldRefreshToken',
"client_secret" => 'ReplaceYourClientSecretKey',
'scope' => 'https://graph.microsoft.com/User.ReadWrite.All',
);
$refreshTokenUrl = "https://login.windows.net/common/oauth2/v2.0/token";
$curl_refresh = curl_init($refreshTokenUrl);
curl_setopt($curl_refresh, CURLOPT_POST, true);
curl_setopt($curl_refresh, CURLOPT_POSTFIELDS, $post_params_refresh);
curl_setopt($curl_refresh, CURLOPT_HTTPHEADER, array("application/x-www-form-urlencoded"));
curl_setopt($curl_refresh, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($curl_refresh, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl_refresh, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl_refresh, CURLOPT_RETURNTRANSFER, 1);
$response_refresh = curl_exec($curl_refresh);
$arrResponseRefresh = json_decode($response_refresh);
$accessToken = $arrResponseRefresh->access_token;
$refreshToken = $arrResponseRefresh->refresh_token;

使用这个curl方法获得一个新的刷新令牌,并将这个刷新令牌更新为之前存储的旧令牌。

相关问题