当前位置: 首页 > 知识库问答 >
问题:

如何实现Google API刷新令牌

孙弘博
2023-03-14

400-错误请求-{“error”:“invalid_grant”,“error_description”:“Bad Request”}

我的请求URL如下所示:

当用户与代码一起被重定向回来时,我的令牌请求函数被调用

public OAuth2Token GetToken(string code)
{
    var client = new RestClient(_tokenUri);
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
    request.AddParameter("undefined", $"client_id={_clientId}&client_secret={_secret}&code={code}&redirect_uri={_redirectUri}&grant_type=authorization_code", ParameterType.RequestBody);
    var response = client.Execute<OAuth2Token>(request);
    return response.Data;
}

返回Access&refresh令牌,并将其存储在数据库中,然后在我的refresh函数中使用,此处的令牌URI为https://www.googleapis.com/oauth2/v4/token:

public OAuth2Token RefreshToken()
{
    var client = new RestClient(_tokenUri);
    var request = new RestRequest(Method.POST);
    request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
    request.AddParameter("undefined", $"client_id={_clientId}&client_secret={_secret}&refresh_token={_refreshToken}&grant_type=refresh_token", ParameterType.RequestBody);
    var response = client.Execute<OAuth2Token>(request);
    if (!response.IsSuccessful)
        if (response.ErrorException == null)
            throw new Exception(response.Content); 
        else
            throw response.ErrorException;
    return response.Data;
}

另一点需要注意的是,我的Google应用程序在这里处于测试模式,我已经将用户添加到测试用户列表中。关于我在这里做错了什么,有什么建议吗?

干杯

共有1个答案

陈法
2023-03-14
  request.AddParameter("undefined", $"client_id={_clientId}&client_secret={_secret}&refresh_token={_refreshToken}&grant_type=refresh_token", ParameterType.RequestBody);
 request.AddBody("undefined", $"client_id={_clientId}&client_secret={_secret}&refresh_token={_refreshToken}&grant_type=refresh_token", ParameterType.RequestBody);
GET https://accounts.google.com/o/oauth2/auth?client_id={clientid}&redirect_uri={redirectURI}&scope={scope}&response_type=code
POST https://accounts.google.com/o/oauth2/token
code={AUTHORIZATION CODE}&client_id={ClientId}&client_secret={ClientSecret}&redirect_uri={REDIRECT URI}&grant_type=authorization_code

这里的响应将采用Json格式,并且将是一个刷新令牌和一个访问令牌。注意这里的grant_type是授权代码。

{
"access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4"
}

由于您的访问令牌将在一小时后过期,您需要使用刷新令牌刷新它

这也是一个HTTP POST调用,正文也是查询字符串的形式。注意,这里的授权类型是刷新令牌

POST https://accounts.google.com/o/oauth2/token
client_id={CLIENT ID}&client_secret={ClientSecret}&refresh_token={REFRESH TOKEN}&grant_type=refresh_token
{
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
"token_type" : "Bearer",
"expires_in" : 3600
}
 类似资料:
  • 我在我的应用程序中使用Google API,并且oAuth2刷新令牌在1小时后过期。我正在使用此刷新令牌执行每天运行的任务。我使用OAuth2游乐场创建刷新令牌。有没有办法延长刷新令牌的过期时间?(1个月)

  • 请求你分享你的想法。 提前道谢。

  • 我正在尝试将现有的acquire token实现从ADAL迁移到MSAL。我能够获得访问令牌,grant_type=auth_code流工作正常。 但是,当我试图实现范围为offline_access的grant_type=refresh_token时,问题就来了,尽管我在调试代码时能够看到refresh _Tooken,但由于MSAL没有将refresh-token公开给客户端,所以我没有将其作

  • 我正在制作SPA,并决定使用JWT进行身份验证/授权,我读过一些关于令牌与Cookies的博客。我理解cookie授权是如何工作的,也理解基本令牌授权是如何工作的。问题是,我看不出刷新令牌如何适合它,在我看来,它降低了安全性。让我解释一下,就像我看到的那样: 通过用户名验证用户时 > 服务器还需要不断地查找存储,以查看什么用户,cookie点。 通过用户名验证用户时 这很容易受到XSS(跨站点脚本

  • 我正在使用JWTs为我的应用程序验证用户身份。当用户登录时,他们将获得一个访问令牌和一个刷新令牌。为了保证刷新令牌的安全,我不将其存储在客户端,而是将其与他们的帐户一起保存在后端,这样就不容易访问了。虽然我对刷新令牌的安全性感到困惑,但当我阅读关于如何使用刷新令牌的在线资源时,以下是我理解的逻辑: 身份验证 将访问令牌+刷新令牌存储在某个位置(在我的示例中,访问令牌位于前端,刷新令牌位于后端) 执

  • 本文向大家介绍SpringCloud Bus如何实现配置刷新,包括了SpringCloud Bus如何实现配置刷新的使用技巧和注意事项,需要的朋友参考一下 要想实现配置刷新,首先得有项目基础结构 项目一: 注册中心 项目二: 配置中心 项目三: 客户端 先启动注册中心 然后启动配置中心 然后在不同端口启动客户端的多个实例,这些实例都是通过bootstrap.properties连接到配置中心后,加