C# 如何解决';访问令牌已过期,但我们可以';t刷新它';在MVC中

C# 如何解决';访问令牌已过期,但我们可以';t刷新它';在MVC中,c#,model-view-controller,google-api,google-api-dotnet-client,C#,Model View Controller,Google Api,Google Api Dotnet Client,我目前正在开发谷歌Api,目的是获取loggedin人的圈子。我已经拥有访问令牌,但问题是每当我尝试运行代码时,它都会返回此异常 访问令牌已过期,但我们无法刷新它 我如何解决这个问题 var claimsforUser = await UserManager.GetClaimsAsync(User.Identity.GetUserId()); var access_token = claimsforUser.FirstOrDefault(x => x.Type == "urn:google

我目前正在开发谷歌Api,目的是获取loggedin人的圈子。我已经拥有访问令牌,但问题是每当我尝试运行代码时,它都会返回此异常

访问令牌已过期,但我们无法刷新它

我如何解决这个问题

var claimsforUser = await UserManager.GetClaimsAsync(User.Identity.GetUserId());
var access_token = claimsforUser.FirstOrDefault(x => x.Type == "urn:google:accesstoken").Value;

string[] scopes = new string[] {PlusService.Scope.PlusLogin,
                                PlusService.Scope.UserinfoEmail,
                                PlusService.Scope.UserinfoProfile};

var flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {

        ClientSecrets = new ClientSecrets
        {
            ClientId = "xx-xx.apps.googleusercontent.com",
            ClientSecret = "v-xx",
        },
        Scopes = scopes,
        DataStore = new FileDataStore("Store"),
    });

var token = new TokenResponse { AccessToken = access_token, ExpiresInSeconds=50000};
var credential = new UserCredential(flow, Environment.UserName, token);


PlusService service = new PlusService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "ArcaneChatV2",
});

PeopleResource.ListRequest listPeople = service.People.List("me", PeopleResource.ListRequest.CollectionEnum.Visible);
listPeople.MaxResults = 10;
PeopleFeed peopleFeed = listPeople.Execute();
var people = new List<Person>();


while (peopleFeed.Items != null)
{

    foreach (Person item in peopleFeed.Items)
    {
        people.Add(item);
    }
    if (peopleFeed.NextPageToken == null)
    {
        break;
    }
    listPeople.PageToken = peopleFeed.NextPageToken;

    // Execute and process the next page request
    peopleFeed = listPeople.Execute();

}
var claimsforUser=await UserManager.GetClaimsAsync(User.Identity.GetUserId());
var access_token=claimsforUser.FirstOrDefault(x=>x.Type==“urn:google:accesstoken”).Value;
字符串[]范围=新字符串[]{PlusService.Scope.PlusLogin,
PlusService.Scope.UserinfoEmail,
PlusService.Scope.UserinfoProfile};
变量流=新的GoogleAuthorizationCodeFlow(新的GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets=新的ClientSecrets
{
ClientId=“xx.apps.googleusercontent.com”,
ClientSecret=“v-xx”,
},
范围=范围,
数据存储=新文件数据存储(“存储”),
});
var-token=new-TokenResponse{AccessToken=access_-token,ExpiresInSeconds=50000};
var-credential=新的UserCredential(流、Environment.UserName、令牌);
PlusService服务=新的PlusService(新的BaseClientService.Initializer()
{
HttpClientInitializer=凭证,
ApplicationName=“ArcaneChatV2”,
});
PeopleResource.ListRequest listPeople=service.People.List(“我”,PeopleResource.ListRequest.CollectionEnum.Visible);
listPeople.MaxResults=10;
PeopleFeed PeopleFeed=listPeople.Execute();
var people=新列表();
while(peopleFeed.Items!=null)
{
foreach(peopleFeed.Items中的个人项目)
{
人员。添加(项目);
}
if(peopleFeed.NextPageToken==null)
{
打破
}
listPeople.PageToken=peopleFeed.NextPageToken;
//执行并处理下一页请求
peopleFeed=listPeople.Execute();
}

假设您已经有了刷新令牌,那么在创建
令牌响应时就包括了刷新令牌

var-token=new-TokenResponse{
AccessToken=访问令牌,
刷新令牌=刷新令牌
};

UserCredential是用于使用访问令牌的线程安全帮助器类 访问受保护的资源访问令牌通常在 1小时后,如果您尝试使用它,则会出现错误

UserCredential和AuthorizationCodeFlow自动处理 “刷新”令牌,这意味着获得一个新的访问令牌。 这是使用一个长寿命的刷新令牌来完成的,您将随附该令牌 如果使用access\u type=offline参数,则使用访问令牌 在授权代码流期间

在大多数应用程序中,建议存储凭据的访问权限 永久存储中的令牌和刷新令牌。否则,你会 需要在浏览器中向最终用户显示授权页 每小时一次,因为访问令牌在您 收到了