仅通过一次OAuth2流程授权我的Google API应用

时间:2013-07-19 11:36:30

标签: java authentication oauth google-api google-api-java-client

我正在开发一个应用程序来向某些帐户添加任务使用“Google Tasks API”for java使用Oauth 2.0。

问题是每次我想在帐户上添加任务我必须使用身份验证页面并使用帐户和密码进行授权,然后等待回调添加任务,这是不切实际的

我想知道是否有另一种方法来授权java应用程序而不执行它并避免回调函数:

可以通过发送电子邮件等方式向Gmail帐户所有者发送链接。

所以我想做的就是:

  1. 我希望应用程序的用户从外部对其进行授权而不执行它
  2. 当我执行它来添加任务时我只想知道如果它是从用户授权我添加任务,如果不是我跳过它给其他用户等..
  3. thx

1 个答案:

答案 0 :(得分:3)

典型的OAuth 2.0流程如下:

  1. 发送访问特定范围内用户数据的权限请求(https://www.googleapis.com/auth/tasks
  2. 用户获取他们必须登录的身份验证屏幕,并允许您的应用“管理您的任务”
  3. 您的应用会收到授权码
  4. 您的应用必须交换访问令牌刷新令牌的授权码。
  5. 访问令牌可用于对用户数据进行经过身份验证的请求,但会在一段时间后过期。刷新令牌永不过期(除非用户在其帐户设置中撤消了应用程序的权限),并且可用于获取新的请求令牌。

    您可以在OAuth2.0 Playground

    中查看整个流程

    如果您正确地遵循流程并保存两个令牌(在数据库或文件中,具体取决于平台),那么用户必须只能看到该屏幕一次

    现在最好的部分: Google API Java客户端库应该为您解决所有问题。要使用的确切类会根据您使用的库的版本而更改,但您应该设置在创建服务对象时保留标记的位置。例如,使用日历API:

    // For this example we're saving the credentials in a file on the system,
    //  rather than a database.
    FileCredentialStore credentialStore = new FileCredentialStore(
        new File(System.getProperty("user.home"), ".credentials/calendar.json"), JSON_FACTORY);
    
    // set up authorization code flow
    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
        HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, Collections.singleton(CalendarScopes.CALENDAR))
        .setCredentialStore(credentialStore)  // This will store the tokens for you
        .build();
    

    您可以在calendar-cmdline-sample here中查看。有plenty of other samples too,可以在App Engine或Android上查看授权流程。