API OAuth 2.0-XERO的R接收状态为400 [英] API OAuth 2.0 - XERO acces with R receiving status 400

查看:50
本文介绍了API OAuth 2.0-XERO的R接收状态为400的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们必须迁移到Oauth 2.0.但是,我面临以下问题.状态400我相信由于某些参数可能无法正确输入.如果有人知道什么地方可能有问题或有什么想法,请告诉我.

We have to migrate to Oauth 2.0. However, I am facing the following issues. Status 400 I believe due to some parameters that may not be entered right. If anyone know what could be wrong or have any idea please let me know.

这是我的代码:

pack <- c('curl','xml2','XML', 'plyr', 'dplyr','tidyr', 'httr', 'tools', 'lubridate',
          'jsonlite', 'stringr', 'data.table', 'anytime')
sapply(pack, function(x){ 
  if(!require(x,character.only = T, quietly = T)) {install.packages(x, quiet = T)}
  require(x, quietly = T, character.only = T)
})
#New Xero & WFM Api OAuth 2.0 credentials
Client_ID <- 'YOUR_CLIENT_ID'
Client_secret<- 'YOUR_CLIENT_SECRET'

XTID <- 'YOUR_REFERAL_ID'#Referral_ID 
Redirect_URI <- 'https://xero.com/' #OAuth 2.0 redirect URI

response <- GET(paste0('https://login.xero.com/identity/connect/authorize?response_type=code&client_id=',
       Client_ID,'&redirect_uri=',Redirect_URI,'&scope=workflowmax%20offline_access'))
browseURL(response$url)

它可以工作到这里,我能够检索第一个代码,但是我无法获得令牌这就是Xero Doc所说的:

It works till here I am able to retrieve the first code, but I can't get the tokens This is what Xero Doc said:

Xero Doc请求:

Xero Doc request:

POST https://identity.xero.com/connect/token
authorization: "Basic " + base64encode(client_id + ":" + client_secret)
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=xxxxxx
&redirect_uri=https://myapp.com/redirect

现在尝试获取令牌,我尝试了几种形式.但是,它们看起来都非常相似.

Now trying to get the token I tried several forms. however, they all look really similar.

code <- 'YOUR_CODE'

credentials = list();
credentials['grant_type'] <- "authorization_code"
credentials['code'] <- code
credentials['redirect_uri'] <- Redirect_URI

b64_id_secret <- base64_enc('YOUR_CLIENT_ID:YOUR_CLIENT_SECRET')
# user <- paste("Basic", user, sep = " ")
url <- 'https://identity.xero.com/connect/token'    
POST(url, add_headers('Authorization'= paste0('Basic ', b64_id_secret)), 
         body  = credentials,
         verbose(), encode = 'form')

响应:

Response [https://identity.xero.com/connect/token?grant_type=authorization_code&code=YOUR_CODE&redirect_uri=https://waterlineprojects.com/]
  Date: 2020-11-20 02:48
  Status: 400
  Content-Type: application/json; charset=UTF-8
  Size: 27 B

XERO文档: https://developer.xero.com/documentation/oauth2/overview

推荐答案

我执行了变通方法并使其运行.这是访问Oauth 2.0的方式.

I did my workaround and got it running. This is the way to access the Oauth 2.0.

pack <- c('curl','xml2','XML', 'plyr', 'dplyr','tidyr', 'httr', 'tools', 'lubridate',
          'jsonlite', 'stringr', 'data.table', 'anytime', 'RCurl', 'rvest', 'opnessl', 'jose')
sapply(pack, function(x){ 
  if(!require(x,character.only = T, quietly = T)) {install.packages(x, quiet = T)}
  require(x, quietly = T, character.only = T)
})

#New Xero & WFM Api OAuth 2.0 credentials
Client_ID <- 'YOUR_ID'
Client_secret<- 'YOUR_SECRET'

XTID_Xero <- 'YOUR_XTID'#Referral_ID 
Redirect_URI <- 'YOUR_CALL_BACK_URL' #OAuth 2.0 redirect URI

# Create the app
app <- oauth_app("YOUR_API_NAME",
                 key = Client_ID,
                 secret = Client_secret,
                 redirect_uri = Redirect_URI
  
)
# Create the endpoint
create_endpoint <- function()
{
  request <- "https://identity.xero.com/connect/token"
  authorize <- "https://login.xero.com/identity/connect/authorize"
  access <- "https://identity.xero.com/connect/token"
  httr::oauth_endpoint(request, authorize, access)
}
api <- create_endpoint()

header <- httr::add_headers(Authorization=paste0("Basic ", RCurl::base64Encode(charToRaw(paste0(Client_ID, ":", Client_secret)))))
content_type <- httr::content_type("application/x-www-form-urlencoded")

# Define the scope
scope_WFM <- "openid profile offline_access payroll.employees.read payroll.payruns.read payroll.payslip.read payroll.timesheets.read accounting.transactions.read accounting.reports.read accounting.journals.read"

# Get the code
httr::BROWSE(oauth2.0_authorize_url(api, app, scope = scope_WFM))
#get the code from the URL displayed in your browser
code_xero <- 'YOR_CODE'
state_xero <- 'YOUR_STATE'

token <- httr::oauth2.0_token(
     endpoint = api,
     app = app,
     scope = scope_WFM,
     config_init = c(header, content_type),
     use_basic_auth = TRUE,
     query_authorize_extra = list(prompt = "login"),
     type = "code",
     credentials = oauth2.0_access_token(api, app, code_xero),
     cache = FALSE
   )


  #get your xero-tenant-id
    access <- GET("https://api.xero.com/connections", config = token)
    connections <- content(access, 'text')
    connections <- fromJSON(connections, flatten = T)

这篇关于API OAuth 2.0-XERO的R接收状态为400的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆