检索Oauth 2.0刷新令牌与R htr谷歌演示

dbf7pr2w  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(106)

当我按照Hadley的R google Oauth2.0演示访问Fusion表时,刷新令牌不可用。
演示:https://github.com/hadley/httr/blob/master/demo/oauth2-google.r
修改后的"离线"尝试示例:

google_token <- oauth2.0_token(oauth_endpoints("google"), myapp,
                           scope = "https://www.googleapis.com/auth/fusiontables",
                           type= "offline",
                           use_oob = FALSE,
                           cache = TRUE)

关于如何检索刷新令牌的任何指导都非常感谢。

    • UPDATE**:使用以下代码,将返回带有google_token $凭据的字符串。这是此处引用的授权码吗:www.example.comhttps://developers.google.com/accounts/docs/OAuth2WebServer#offline
google_token <- oauth2.0_token(oauth_endpoints("google"), myapp,
                           scope = "https://www.googleapis.com/auth/fusiontables", 
                           type= "access_type='offline'",
                           use_oob = FALSE,
                           cache = TRUE)

谢谢你。

3hvapo4f

3hvapo4f1#

我来晚了一点,但希望这能帮助到一些人。我上周发现了这个问题,因为我也在为同样的问题而挣扎。像你一样,我阅读了API文档,并尝试在"oauth2.0_token"的"type"字段中输入"offline()"函数,但它搞乱了响应。我从Github存储库下载了HTHR包源文件,四处看看。经过一番挖掘,我找到了一个绕过它的方法。
如果您修改了oauth-init中的"authorize-url"变量,那么:

authorize_url <- modify_url(endpoint$authorize, query = compact(list(
    client_id = app$key,
    scope = scope_arg,
    redirect_uri = redirect_uri,
    response_type = "code",
    state = state)))

改为:

authorize_url <- modify_url(endpoint$authorize, query = compact(list(
    client_id = app$key,
    scope = scope_arg,
    redirect_uri = redirect_uri,
    response_type = "code",
    state = state,
    access_type="offline")))

然后调用oauth-token和所有依赖函数(包括oauth-init),您将获得一个刷新令牌。由于某种原因,当oauth_token调用init_oauth2. 0时,它不传递"type"参数。
这是一个讨厌的变通方案,我可能犯了几个罪,但它确实工作。

gfttwv5a

gfttwv5a2#

甚至后来的聚会,但在这里插话,因为我非常努力地获得一个令牌对象,其中确实包含一个刷新令牌。
下面是我的代码:

# get google client ID and secret from JSON file
  google_client <- gargle::gargle_oauth_client_from_json(".secrets/myapp.json")

  # create app and endpoint objects
  app <- httr::oauth_app(appname = "myapp", key = google_client$id, secret = google_client$secret)
  endpoint <- httr::oauth_endpoints("google")

  # generate token to access google drive and google presentations (change the scopes to whatever you need)
  token <- httr::oauth2.0_token(endpoint = endpoint, app = app,
                                scope = c("https://www.googleapis.com/auth/presentations",
                                          "https://www.googleapis.com/auth/drive"),
                                cache = ".secrets/httr-oauth")

token$credentials

$access_token
[1] "XXX"

$expires_in
[1] 3599

$refresh_token
[1] "1//YYY"

$scope
[1] "https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/drive"

$token_type
[1] "Bearer"

原来我的问题不在于代码,而在于我在谷歌云中创建的应用程序。为了接收刷新令牌,在创建OAuth2客户端ID时必须选择"桌面应用程序"。我认为这会自动将访问类型设置为"离线"。以JSON格式下载此桌面客户端(在我的情况下为.secrets/myapp.json)。

相关问题