【问题标题】:Authorization working locally but not hosted授权在本地工作但未托管
【发布时间】:2019-07-20 21:46:37
【问题描述】:

这是我正在使用我的驱动器启用文件“credentials.json”进行项目 OAuth 2.0 身份验证的当前代码,这对本地项目工作正常,当我要实施这个项目时停止工作。

public class GoogleDriveUtils { 

private static final String APPLICATION_NAME = "Google Drive API Java Quickstart";

private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

// Directory to store user credentials for this application.
private static final java.io.File CREDENTIALS_FOLDER //
        = new java.io.File("/tmp/");
private static final String CLIENT_SECRET_FILE_NAME = "credentials.json";

private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE);

// Global instance of the {@link FileDataStoreFactory}.
private static FileDataStoreFactory DATA_STORE_FACTORY;

// Global instance of the HTTP transport.
private static HttpTransport HTTP_TRANSPORT;
private static Drive _driveService;
static {
    try {
        HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        DATA_STORE_FACTORY = new FileDataStoreFactory(CREDENTIALS_FOLDER);
    } catch (Throwable t) {
        t.printStackTrace();
        System.exit(1);
    }
}
public static Credential getCredentials() throws IOException {
    java.io.File clientSecretFilePath = new java.io.File(CREDENTIALS_FOLDER, CLIENT_SECRET_FILE_NAME);
   if (!clientSecretFilePath.exists()) {
        throw new FileNotFoundException("Please copy " + CLIENT_SECRET_FILE_NAME //
                + " to folder: " + CREDENTIALS_FOLDER.getAbsolutePath());
    }
    InputStream in = new FileInputStream(clientSecretFilePath);
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY,
            clientSecrets, SCOPES).setDataStoreFactory(DATA_STORE_FACTORY).setAccessType("offline").build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    return credential;
}

public static Drive getDriveService() throws IOException {
    if (_driveService != null) {
        return _driveService;
    }
    Credential credential = getCredentials();
    //
    _driveService = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential) //
            .setApplicationName(APPLICATION_NAME).build();
    return _driveService;
}

}

【问题讨论】:

  • 请定义停止工作在托管之前它是否有效?究竟是什么不工作?你在哪里托管它?
  • 是的,它在托管之前工作,我认为这是因为重定向 url 就像在生成凭据时没有指定 URL 之前一样,它需要 'localhost://**** *' - 当我指定我的托管网址时,例如www.****.com
  • accounts.google.com/o/oauth2/…**********************.apps.googleusercontent.com&redirect_uri=https://*******.com/Callback&response_type =code&scope=googleapis.com/auth/drive

标签: java tomcat google-api google-drive-api google-api-java-client


【解决方案1】:

AuthorizationCodeInstalledApp

用于已安装应用程序,这意味着浏览器窗口将在运行代码的机器上打开。如果您将其托管在 Web 服务器上,那么它会尝试在该计算机上打开浏览器窗口。不在用户机器上。

你应该关注Web server applications

public class CalendarServletSample extends AbstractAuthorizationCodeServlet {

  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws IOException {
    // do stuff
  }

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException {
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  }

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException {
    return new GoogleAuthorizationCodeFlow.Builder(
        new NetHttpTransport(), JacksonFactory.getDefaultInstance(),
        "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]",
        Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(
        DATA_STORE_FACTORY).setAccessType("offline").build();
  }

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
    // return user ID
  }
}

public class CalendarServletCallbackSample extends AbstractAuthorizationCodeCallbackServlet {

  @Override
  protected void onSuccess(HttpServletRequest req, HttpServletResponse resp, Credential credential)
      throws ServletException, IOException {
    resp.sendRedirect("/");
  }

  @Override
  protected void onError(
      HttpServletRequest req, HttpServletResponse resp, AuthorizationCodeResponseUrl errorResponse)
      throws ServletException, IOException {
    // handle error
  }

  @Override
  protected String getRedirectUri(HttpServletRequest req) throws ServletException, IOException {
    GenericUrl url = new GenericUrl(req.getRequestURL().toString());
    url.setRawPath("/oauth2callback");
    return url.build();
  }

  @Override
  protected AuthorizationCodeFlow initializeFlow() throws IOException {
    return new GoogleAuthorizationCodeFlow.Builder(
        new NetHttpTransport(), JacksonFactory.getDefaultInstance()
        "[[ENTER YOUR CLIENT ID]]", "[[ENTER YOUR CLIENT SECRET]]",
        Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(
        DATA_STORE_FACTORY).setAccessType("offline").build();
  }

  @Override
  protected String getUserId(HttpServletRequest req) throws ServletException, IOException {
    // return user ID
  }
}

【讨论】:

  • 我需要在方法中添加什么来运行代码并获取凭证类对象-@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // do stuff }
  • @DalmTo 你有完整代码的项目可以在github上成功运行吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 2021-12-01
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多