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

Spring 5,OAuth2在401返回后使用Google刷新访问令牌

喻昀
2023-03-14
spring.security.oauth2.client.registration.google.clientId=xyz
spring.security.oauth2.client.registration.google.clientSecret=xyz
spring.security.oauth2.client.registration.google.scope=email,profile,openid,https://www.googleapis.com/auth/calendar,https://www.googleapis.com/auth/spreadsheets

我用http://localhost:8080/oauth2/authorization/google登录,并正常保存到google calendar。

获取访问令牌如下所示:

private String getAccessToken() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    String accessToken = null;
    if (authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
      OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
      String clientRegistrationId = oauthToken.getAuthorizedClientRegistrationId();
      OAuth2AuthorizedClient client = authorizedClientService.loadAuthorizedClient(
        clientRegistrationId, oauthToken.getName());
      accessToken = client.getAccessToken().getTokenValue();
    }
    return accessToken;
  }

OAuth2AuthorizedClient包含刷新标记。

但1小时后访问令牌过期,我不知道如何刷新它。无需重新登录。

使用长寿命刷新令牌获取新的访问令牌。

我在一个Spring发现了这个带有刷新令牌的谷歌OAuth2,但对我来说不起作用。

共有1个答案

梁烨烨
2023-03-14
    Credential credential = new GoogleCredential().setAccessToken(tokenUtils.getAccessToken());
 private Calendar getClient() throws GeneralSecurityException, IOException {
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

    Credential credential = new GoogleCredential.Builder()
      .setJsonFactory(JSON_FACTORY)
      .setTransport(httpTransport)
      .setClientSecrets(clientId, clientSecret)
      .build()
      .setAccessToken(tokenUtils.getAccessToken())
      .setRefreshToken(tokenUtils.getRefreshToken());

    return new Calendar.Builder(httpTransport, JSON_FACTORY, credential)
      .setApplicationName("appname").build();
  }
public class TokenUtils {

  private final OAuth2AuthorizedClientService authorizedClientService;

  public TokenUtils(OAuth2AuthorizedClientService authorizedClientService) {
    this.authorizedClientService = authorizedClientService;
  }

  public String getAccessToken() {
    OAuth2AuthorizedClient client = getClient();
    return client.getAccessToken().getTokenValue();
  }

  public String getRefreshToken() {
    OAuth2AuthorizedClient client = getClient();
    return client.getRefreshToken().getTokenValue();
  }

  public OAuth2AuthorizedClient getClient() {
    OAuth2AuthenticationToken oauthToken = getOAuthToken();
    return authorizedClientService.loadAuthorizedClient(
      oauthToken.getAuthorizedClientRegistrationId(), oauthToken.getName());
  }

  private OAuth2AuthenticationToken getOAuthToken() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication.getClass().isAssignableFrom(OAuth2AuthenticationToken.class)) {
      return (OAuth2AuthenticationToken) authentication;
    }
    throw new SecurityException("Authentication is not OAuth2AuthenticationToken");
  }
}
 类似资料:
  • 我可以通过oauth过程获得一个令牌,我可以成功地使用该令牌与GDrive交互。该令牌有AccessToken,但没有RefreshToken。如何获得刷新令牌? 这是在web服务中。以下是启动oauth授权过程的代码: 以下是调用/gdrivecb时调用的相关代码(oauthconfig与前面相同,code是URL参数: 该令牌包含AccessToken,但不包含refreshToken。它工作

  • 我试图使用刷新令牌访问GoogleDrive API(我自己的A/C)--从OAuth Playground发布--如下所示。我正在使用我的刷新令牌和访问令牌进行脱机访问,但我得到了一个未经授权的401。我的代码是基于参考Belwo,以及google-api javadocs构建离线请求的建议

  • 使用google oauth2库,我可以在用户第一次通过时成功地对其进行身份验证,获得他们的刷新令牌和第一次访问令牌。直到令牌过期,一切都按预期工作。 但是,当访问令牌过期时,我需要获得一个新的访问令牌,并使用现有的刷新令牌将这些令牌存储在我的数据存储区中。我知道文档中规定了令牌过期时应该重新提取它们自己,但是当我为每个调用创建一个新客户机(以确保令牌不会在用户之间重用)时,我认为客户机在令牌有机

  • 我以前在一个OAuth2应用程序中工作过,其中的逻辑是在旧的访问令牌过期后通过刷新令牌生成新的访问令牌。 如果访问令牌在30分钟后过期,然后您只需要传入刷新令牌(但没有重新生成),那么刷新令牌的意义是什么?

  • 我的问题是如何使用OAuth2.0从刷新令牌中获取访问令牌。我还没有找到任何从刷新令牌中获取访问令牌的例子。 我参考了[Google+API参考],但他们使用HTTP方法提到了它。2请用C#提供一些使用Google+API提供的方法的例子。

  • 目前,我正在使用https://developers.Google.com/Calendar/quickstart/php这个api,但是令牌在3-4小时后到期,如何自动刷新谷歌日历api的访问令牌 当前代码为: