Java YouTube数据API V3-自动化授权过程,而不是手动干预

Java YouTube数据API V3-自动化授权过程,而不是手动干预,java,oauth,youtube,youtube-api,youtube-data-api,Java,Oauth,Youtube,Youtube Api,Youtube Data Api,我正在使用YouTube数据API V3将视频上传到我的YouTube频道。提供的样本代码中的授权代码需要手动干预授权过程。每次我重新启动服务器时,它都会打开浏览器并询问我的身份验证和权限。对于我的Windows PC来说,这很好,但我将把这段代码部署到一台远程Linux机器上,我只有SSH访问权限 有没有办法使这个过程自动化?类似于使用普通凭证(用户名和密码)访问API或一次性执行此过程(永久身份验证/授权) 我确实读过一些关于这个主题的帖子,这些帖子指向使用刷新令牌。通常我会说,你应该使用服

我正在使用YouTube数据API V3将视频上传到我的YouTube频道。提供的样本代码中的授权代码需要手动干预授权过程。每次我重新启动服务器时,它都会打开浏览器并询问我的身份验证和权限。对于我的Windows PC来说,这很好,但我将把这段代码部署到一台远程Linux机器上,我只有SSH访问权限

有没有办法使这个过程自动化?类似于使用普通凭证(用户名和密码)访问API或一次性执行此过程(永久身份验证/授权)


我确实读过一些关于这个主题的帖子,这些帖子指向使用刷新令牌。

通常我会说,你应该使用服务帐户,那么你根本不需要进行身份验证。但是,YouTube API不支持服务帐户身份验证

我无法解释为什么重新启动后需要刷新身份验证。您的代码应保存包含刷新令牌的凭据文件。即使在重新启动后,刷新令牌也应继续工作。我猜你的代码有问题

这是一个显示如何保存凭据的示例。它是为人而设的api,而不是Youtube。如果您需要任何帮助,请在Youtube上修改它。服务器重新启动时,不会删除这些凭据

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.people.v1.PeopleService;
import com.google.api.services.people.v1.PeopleScopes;
import com.google.api.services.people.v1.model.ListConnectionsResponse;
import com.google.api.services.people.v1.model.Person;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;

public class Quickstart {
    /** Application name. */
    private static final String APPLICATION_NAME =
        "People API Java Quickstart";

    /** Directory to store user credentials for this application. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/people.googleapis.com-java-quickstart");

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

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY =
        JacksonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport HTTP_TRANSPORT;

    /** Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/people.googleapis.com-java-quickstart
     */
    private static final List<String> SCOPES =
        Arrays.asList(PeopleScopes.CONTACTS_READONLY);

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
            Quickstart.class.getResourceAsStream("/client_secret.json");
        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");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized People client service.
     * @return an authorized People client service
     * @throws IOException
     */
    public static PeopleService getPeopleService() throws IOException {
        Credential credential = authorize();
        return new PeopleService.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void main(String [] args) throws IOException {
        PeopleService service = getPeopleService();

        // Request 10 connections.
        ListConnectionsResponse response = service.people().connections()
                .list("people/me")
                .setPageSize(10)
                .setPersonFields("names,emailAddresses")
                .execute();

        // Print display name of connections if available.
        List<Person> connections = response.getConnections();
        if (connections != null && connections.size() > 0) {
            for (Person person : connections) {
                List<Name> names = person.getNames();
                if (names != null && names.size() > 0) {
                    System.out.println("Name: " + person.getNames().get(0)
                            .getDisplayName());
                } else {
                    System.out.println("No names available for connection.");
                }
            }
        } else {
            System.out.println("No connections found.");
        }
    }

}
import com.google.api.client.auth.oauth2.Credential;
导入com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
导入com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
导入com.google.api.client.googleapis.auth.oauth2.googleaauthorizationcodeflow;
导入com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
导入com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
导入com.google.api.client.http.HttpTransport;
导入com.google.api.client.json.jackson2.JacksonFactory;
导入com.google.api.client.json.JsonFactory;
导入com.google.api.client.util.store.FileDataStoreFactory;
导入com.google.api.services.people.v1.PeopleService;
导入com.google.api.services.people.v1.PeopleScopes;
导入com.google.api.services.people.v1.model.ListConnectionsResponse;
导入com.google.api.services.people.v1.model.Person;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.util.array;
导入java.util.List;
公共类快速入门{
/**应用程序名称*/
私有静态最终字符串应用程序\u名称=
“People API Java快速入门”;
/**用于存储此应用程序的用户凭据的目录*/
private static final java.io.File DATA_STORE_DIR=new java.io.File(
System.getProperty(“user.home”),“.credentials/people.googleapis.com java quickstart”);
/**{@link FileDataStoreFactory}的全局实例*/
私有静态文件数据存储工厂数据存储工厂;
/**JSON工厂的全局实例*/
私有静态最终JsonFactory JSON_工厂=
JacksonFactory.getDefaultInstance();
/**HTTP传输的全局实例*/
专用静态HttpTransport HTTP_传输;
/**此快速启动所需作用域的全局实例。
*
*如果修改这些作用域,请删除以前保存的凭据
*访问~/.credentials/people.googleapis.com-java-quickstart
*/
私有静态最终列表作用域=
Arrays.asList(PeopleScopes.CONTACTS\u只读);
静止的{
试一试{
HTTP_TRANSPORT=GoogleNetHttpTransport.newTrustedTransport();
DATA\u STORE\u FACTORY=新文件datastorefactory(DATA\u STORE\u DIR);
}捕获(可丢弃的t){
t、 printStackTrace();
系统出口(1);
}
}
/**
*创建授权凭据对象。
*@返回授权凭证对象。
*@抛出异常
*/
公共静态凭据授权()引发IOException{
//加载客户端机密。
输入流输入=
Quickstart.class.getResourceAsStream(“/client_secret.json”);
谷歌客户机密=
load(JSON_工厂,新的InputStreamReader(in));
//生成流并触发用户授权请求。
GoogleAuthorizationCodeFlow=
新的GoogleAuthorizationCodeFlow.Builder(
HTTP_传输、JSON_工厂、客户端机密、作用域)
.setDataStoreFactory(数据存储工厂)
.setAccessType(“脱机”)
.build();
凭证凭证=新授权代码已安装App(
流,新的LocalServerReceiver())。授权(“用户”);
System.out.println(
“凭证保存到”+数据存储\目录getAbsolutePath());
返回凭证;
}
/**
*生成并返回授权人员客户端服务。
*@返回授权人员客户端服务
*@抛出异常
*/
公共静态PeopleService getPeopleService()引发IOException{
凭证=授权();
返回新的PeopleService.Builder(HTTP_传输、JSON_工厂、凭证)
.setApplicationName(应用程序名称)
.build();
}
公共静态void main(字符串[]args)引发IOException{
PeopleService=getPeopleService();
//请求10个连接。
ListConnectionsResponse=service.people().connections()
.列表(“人/我”)
.setPageSize(10)
.setPersonFields(“名称、电子邮件地址”)
.execute();
//打印连接的显示名称(如果可用)。
List connections=response.getConnections();
if(connections!=null&&connections.size()>0){
F
public class YoutubeAuth {

    private static final String CLIENT_SECRETS= "/client_secret.json";

    private static final Collection<String> SCOPES =
            Arrays.asList("https://www.googleapis.com/auth/youtube.readonly");

    private static FileDataStoreFactory dataStoreFactory;

    private static final java.io.File DATA_STORE_DIR =
            new java.io.File(System.getProperty("user.home"), ".store/youtube");

    private static final String APPLICATION_NAME = "Custom Application Name";

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

    /**
     * Create an authorized Credential object.
     *
     * @return an authorized Credential object.
     * @throws IOException
     */
    private static Credential authorize(final NetHttpTransport httpTransport) throws IOException {

       // Load client secrets.
        InputStream in = YoutubeAuth.class.getResourceAsStream(CLIENT_SECRETS);
        GoogleClientSecrets clientSecrets =
                GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow =
                new GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
                        .setDataStoreFactory(dataStoreFactory)
                        .build();
        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    }

    /**
     * Build and return an authorized API client service.
     *
     * @return an authorized API client service
     * @throws GeneralSecurityException, IOException
     */
    public static YouTube getService() throws GeneralSecurityException, IOException {
        final NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);

        Credential credential = authorize(httpTransport);


        return new YouTube.Builder(httpTransport, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

}
private static FileDataStoreFactory dataStoreFactory;
private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"),".store/youtube");
.setDataStoreFactory(dataStoreFactory)
dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);


YouTube youtubeService = LfkYoutubeAuth.getService();
...
// some other code
---