Использование OAuth для извлечения токена доступа без перенаправления на веб-страницу

#api #google-app-engine #oauth #google-oauth

#API #google-app-engine #oauth #google-oauth

Вопрос:

Я написал Java-программу, которая использует идентификатор клиента и секрет клиента для аутентификации. Когда я запускаю свою программу, она выдает URL-адрес, и когда я перехожу на этот URL, она выдает мне токен доступа. Как я могу программно получить токен доступа без использования браузера?

Мой код:

 import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.auth.oauth2.GoogleTokenResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.admin.directory.Directory;
import com.google.api.services.admin.directory.DirectoryScopes;
import com.google.api.services.admin.directory.model.User;
import com.google.api.services.admin.directory.model.Users;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;


public class DirectoryCommandLine {

  private static String CLIENT_ID = "YOUR_CLIENT_ID";
  private static String CLIENT_SECRET = "YOUR_CLIENT_SECRET";

  private static String REDIRECT_URI = "urn:ietf:wg:oauth:2.0:oob";

  public static void main(String[] args) throws IOException {
    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        httpTransport, jsonFactory, CLIENT_ID, CLIENT_SECRET, Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
        .setAccessType("online")
        .setApprovalPrompt("auto").build();

    String url = flow.newAuthorizationUrl().setRedirectUri(REDIRECT_URI).build();
    System.out.println("Please open the following URL in your browser then type the authorization code:");
    System.out.println("  "   url);
    System.out.println("Enter authorization code:");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String code = br.readLine();

    GoogleTokenResponse response = flow.newTokenRequest(code).setRedirectUri(REDIRECT_URI).execute();
    GoogleCredential credential = new GoogleCredential().setFromTokenResponse(response);

    // Create a new authorized API client
    Directory service = new Directory.Builder(httpTransport, jsonFactory, credential)
        .setApplicationName("DirectoryCommandLine")
        .build();

    List<User> allUsers = new ArrayList<User>();
    Directory.Users.List request = service.users().list().setCustomer("my_customer");

    // Get all users
    do {
      try {
        Users currentPage = request.execute();
        allUsers.addAll(currentPage.getUsers());
        request.setPageToken(currentPage.getNextPageToken());
      } catch (IOException e) {
        System.out.println("An error occurred: "   e);
        request.setPageToken(null);
      }
    } while (request.getPageToken() != null amp;amp;
             request.getPageToken().length() > 0 );

    // Print all users
    for (User currentUser : allUsers) {
      System.out.println(currentUser.getPrimaryEmail());
    }
  }
}
  

Ответ №1:

Вам действительно нужно использовать браузер, чтобы получить авторизацию пользователя, но вам нужно сделать это только один раз, если вы надежно храните свой токен обновления. Каков ваш сценарий? Вы можете использовать встроенный браузер в мобильном устройстве и автоматически получать код авторизации.

Комментарии:

1. Я использовал браузер с перенаправляющим uri для своего веб-сервера. Я получил токен доступа с помощью функции request.getparameter().