首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用刷新令牌访问Google,没有浏览器,401错误

使用刷新令牌访问Google,没有浏览器,401错误
EN

Stack Overflow用户
提问于 2015-02-18 23:05:16
回答 2查看 2.1K关注 0票数 2

我正在尝试使用刷新令牌(从GoogleDrive游乐场发出)访问OAuth API (我自己的a/c),如下所示。我正在使用我的刷新令牌和访问令牌进行脱机访问,但我得到了401未经授权。我的代码是基于参考belwoand google-api javadocs建议构建离线请求的。

我不想使用浏览器,我希望从服务器端的应用程序中运行它来上传到我自己的a/c。

代码语言:javascript
复制
ref: http://stackoverflow.com/questions/10533203/fetching-access-token-from-refresh-token-using-java

代码:

代码语言:javascript
复制
public static void main(String[] args) throws IOException {
        HttpTransport TRANSPORT = new NetHttpTransport();
        JsonFactory JSON_FACTORY = new JacksonFactory();

        String refreshTokenString="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //from console

        String accessTokenString ="yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; //from console

        GoogleCredential credential = createCredentialWithRefreshToken(
            TRANSPORT, JSON_FACTORY, new TokenResponse().setRefreshToken(refreshTokenString));
    credential.setAccessToken("accessTokenString");


    //exeucute HTTP request for offline accessTokenString

    // Execute HTTP GET request to revoke current token.
    HttpResponse response = TRANSPORT.createRequestFactory()
            .buildGetRequest(new GenericUrl(
                    String.format(
                            "https://www.googleapis.com/drive/v2/changes",
                            credential.getAccessToken()))).execute();

    System.out.println("RESPONSE: " +response);

}

 public static GoogleCredential createCredentialWithRefreshToken(HttpTransport transport,
                                                                    JsonFactory jsonFactory, TokenResponse tokenResponse) {

    HttpTransport TRANSPORT = new NetHttpTransport();
    JsonFactory JSON_FACTORY = new JacksonFactory();
    return new GoogleCredential.Builder().setTransport(transport)
            .setJsonFactory(JSON_FACTORY)
            .setClientSecrets(CLIENT_ID, CLIENT_SECRET)
            .build()
            .setFromTokenResponse(tokenResponse);
}

而错误是:

代码语言:javascript
复制
    {
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Login Required",
    "locationType": "header",
    "location": "Authorization"
   }
  ],
  "code": 401,
  "message": "Login Required"
 }
}

我正在使用有效的刷新令牌和访问令牌(在操场控制台上工作),但是当从Java应用程序运行时,我在这里获得了需要登录的401。我需要从服务器直接到驱动器的每日备份。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-25 19:36:08

您不能在应用程序中使用来自Playgorund的访问或刷新令牌。这些代币由谷歌发行,只能在操场上使用。您获得的令牌与客户端Id和客户端秘密相关联。显然,您的CLIENT_ID和CLIENT_SECRET与Google应用程序使用的不同。

你真的需要你的应用程序来请求这些令牌,所以你第一次需要一个浏览器,这样用户就可以接受你的应用程序(而不是谷歌游乐场)正在谷歌获取你的信息。这被称为“用户同意”,并显示在本页的小图表中:在Web应用程序中使用OAuth 2.0)

然后,当您拥有应用程序的刷新令牌时。您不再需要浏览器来进行日常备份。您可以使用您的代码与有效的刷新令牌为您的应用程序,如您的文章。

票数 4
EN

Stack Overflow用户

发布于 2015-02-19 02:37:31

只有在刷新令牌未过期时才能使用访问?

不是的。必须将刷新令牌转换为访问令牌。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28595677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档