jjzjj

go - BOX/JWT OAuth 2.0 由 golang

coder 2024-07-09 原文

我想在没有用户的情况下从我的服务器上传图像。我做了盒子申请和设置。

我尝试创建 JWT token 并获得访问 token 。之后,我尝试从我的 Box 文件中获取文件信息。但是这个 api 返回 404 状态。

我不知道我错过了什么。如果你知道,请帮助我。

我的代码如下。

package main

import (
    "fmt"
    "io/ioutil"
    "time"

    "encoding/json"
    "github.com/dgrijalva/jwt-go"
    "net/http"
    "net/url"
    "strings"
)

type BoxToken struct {
    AccessToken  string   `json:"access_token"`
    ExpiresIn    int      `json:"expires_in"`
    RestrictedTo []string `json:"restricted_to"`
    TokenType    string   `json:"token_type"`
}

func main() {
    token := jwt.NewWithClaims(jwt.SigningMethodRS512, jwt.MapClaims{
        "iss":          "application client id",
        "sub":          "enterprise id",
        "box_sub_type": "enterprise",
        "aud":          "https://api.box.com/oauth2/token",
        "jti":          "unique id",
        "exp":          time.Now().Unix() + 60,
    })
    token.Header["kid"] = "public key id"

    privateKeyData, err := ioutil.ReadFile("private.key")
    if err != nil {
        panic(err)
    }

    key, err := jwt.ParseRSAPrivateKeyFromPEM(privateKeyData)
    if err != nil {
        panic(err)
    }

    // Generate encoded token and send it as response.
    tokenStr, err := token.SignedString(key)
    if err != nil {
        panic(err)
    }

    //fmt.Println(tokenStr)

    values := url.Values{}
    values.Add("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer")
    values.Add("client_id", "application client id")
    values.Add("client_secret", "application client secret")
    values.Add("assertion", tokenStr)

    req, err := http.NewRequest(http.MethodPost, "https://api.box.com/oauth2/token", strings.NewReader(values.Encode()))
    if err != nil {
        panic(err)
    }

    client := http.DefaultClient

    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    fmt.Println(resp.StatusCode)

    responseBody, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }

    var boxToken BoxToken
    if err := json.Unmarshal(responseBody, &boxToken); err != nil {
        panic(err)
    }

    req2, err := http.NewRequest("GET", "https://api.box.com/2.0/files/FILE_ID?fields=id,name", nil)
    if err != nil {
        panic(err)
    }

    req2.Header.Add("Authorization", `Bearer `+boxToken.AccessToken)

    resp2, err := client.Do(req2)
    if err != nil {
        panic(err)
    }
    defer resp2.Body.Close()

    fmt.Println(resp2.StatusCode)

    responseBody2, err := ioutil.ReadAll(resp2.Body)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(responseBody2))
}

标准输出是

404
{"type":"error","status":404,"code":"not_found","context_info":{"errors":[{"reason":"invalid_parameter","name":"item","message":"Invalid value 'f_${FILE_ID}'. 'item' with value 'f_${FILE_ID}' not found"}]},"help_url":"http:\/\/developers.box.com\/docs\/#errors","message":"Not Found","request_id":"3de39rftkndh2qqn"}

最佳答案

我相信您需要实际传递一个实际的文件 ID 来代替“FILE_ID”:

req2, err := http.NewRequest("GET", "https://api.box.com/2.0/files/FILE_ID?fields=id,name", nil)

基于阅读 API Reference

关于go - BOX/JWT OAuth 2.0 由 golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51489102/

有关go - BOX/JWT OAuth 2.0 由 golang的更多相关文章

  1. ruby-on-rails - Textmate 'Go to symbol' 相当于 Vim - 2

    在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol

  2. ruby-on-rails - 用于 Ruby 的 vim 中的全局 "Go to definition"? - 2

    自97年以来我一直在使用vi/vim进行各种快速编辑和管理任务,但最近才考虑使用它来替换Netbeans作为我选择的ruby​​编辑器。我发现一件事在Netbeans和Eclipse中非常有用的是Ctrl+Click“转到定义”功能,您可以在其中按住Ctrl键并单击一个类或方法,然后它将带您了解定义。现在,我玩过丰富的ctags和rails.vim,而且很接近,但没有雪茄。这就是我想要的:默认情况下在Netbeans和Eclipse中,您可以在本地rails中按住ctrl并单击本地方法或类项目,但你也可以ctrl+click定义在gems或用Ruby编写的系统库。以Netbeans为例

  3. ruby-on-rails - Rails 上的 ruby : How to have multiple submit buttons going to different methods (maybe with with_action? ) - 2

    这个问题在这里已经有了答案:HowdoIcreatemultiplesubmitbuttonsforthesameforminRails?(7个答案)关闭9年前。所以..'save'%>'library'%>然后在我的Controller中:with_actiondo|a|a.savedoenda.librarydoendend问题是只有一个操作被调用...两个submit_tags调用相同的操作...知道为什么吗?或者我如何获得两个按钮以将表单提交给两种不同的方法?

  4. ruby-on-rails - Rails check_box_tag 根据 bool 值检查 - 2

    在我的数据库中,我有一个bool字段:is_in_city。在View中,我尝试将check_box_tag设置为:=check_box_tagc.is_in_city但即使db值为true,它也不会被检查。怎么了?我需要做这样的chekbox,它不是/根据存储在数据库中的dbbool字段值进行检查。我怎样才能做到这一点?另外,如何将我的属性再设置一个复选框? 最佳答案 正确使用check_box_tag方法是这样的:=check_box_tag:name,value,checkedvalue可以是任何东西,checked(应该是)

  5. ruby - 是否可以从 vagrant box 调试 Chef Recipe ? - 2

    我正在为一个vagrantbox的ChefRecipe而苦苦挣扎。我正在使用chef-solo。我对Ruby不是很满意(我以前从未使用过),所以如果我必须这样做的话,编写我的Recipe的过程会很长vagrantprovision每次。有没有办法调试特定的配方?甚至来自虚拟机外壳。我看过chef-shell存在(http://docs.opscode.com/chef_shell.html),当我在虚拟机中时我可以启动它(它工作),但我不明白如何加载我的Recipe并测试它们。 最佳答案 在当前vagrantchefprovisio

  6. DiFi: A Go-as-You-Pay Wi-Fi Access System 精读笔记(三) - 2

    IV.SYSTEMIMPLEMENTATIONWeadoptmodulardesignfollowingtheintegrationofblockchain.Itbringsmoreflexibilitybyseparatingtheimplementationofdifferentfunctionalities,sowecouldleveragetheadvantagesoftheblockchain-basedsmartcontractwhilereducingoverhead.Figure3illustrateshowdifferentmodulesareinvolvedintheint

  7. go-templates - 如何根据表达式有条件地在 Go 模板中设置变量,如果不使用 if 语句包装可能会导致错误 - 2

    问题我该如何做这样的事情:{{$use_ssl:=(ne$.Env.CERT_NAME"")}}其中$.Env.CERT_NAME可能为零/未定义。如果它是零,它给出这个错误:at:errorcallingne:invalidtypeforcomparison注意:我无法控制传递给Go模板的对象,因此必须完全在模板本身内解决这个问题。我尝试过的我试图通过首先检查它是否为非空来变通:{{$use_ssl:=(($.Env.CERT_NAME)&&(ne$.Env.CERT_NAME""))}}但它给出了这个错误:unexpected"&"inoperand所以我切换到这个,这在语法上是允

  8. Go time与string的相爱相杀 - 2

    time包与string包可以说是在Go语言的开发中常用的两个包实际开发过程中(例如web开发)经常会遇到time类型与string类型的交互,计算比较等场景首先来了解GO语言里非常浪漫的一个点,即2006-01-0215:04:05,GO语言诞生的时间,通常用来做时间的格式化time转stringt:=time.Now()//当前时间timeLayoutStr:="2006-01-0215:04:05"t.Format(timeLayoutStr)//返回值为string,可以用一个值来接收它上述例子中,将time类型t转换为string类型,并格式化为年-月-日时-分-秒,这里的格式化是可

  9. javascript - 使用哈希 url 卡在 Angular ui-router State.go 上? - 2

    我正在研究ui-router。我有一个状态:.state('new-personal-orders',{url:'/orders/new-personal-orders/:catId?',template:''})在我的Controller中,我可以使用$state.go('new-personal-orders',null,{reload:true})在Html文件中我有一个anchor标记:Link如果标签被点击,状态就会改变,'new-personal-orders'变成当前状态,在url中有尾随散列。然后url看起来像:http://localhost:3000/orders/

  10. javascript - 如何使用 HTML5 Canvas 而不是 Debug Draw 来绘制我的 Box2D 世界? - 2

    我非常了解HTML5Canvas,我了解使用循环等的基础知识和动画。我正在使用的演示:(单击以制作形状)http://henry.brown.name/experiments/box2d/example-canvas.html我不太熟悉的是Box2D。我正在使用Box2DWeb端口,听说它比Box2D-js更新,我不确定哪个最好。我知道如何初始化“世界”并且我可以在世界中放置对象。然后,我使用Step为世界设置动画-但是到目前为止,为了在屏幕上显示它,我只能使用debugdraw来让它工作,因为它基本上会为你做所有事情。我不想使用调试绘图,而是使用Canvas来绘制,例如一辆汽车,而不

随机推荐