登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  Golang >  Go问答

Go语言中如何使用Azure AD获取OAuth2.0访问令牌?

来源:stackoverflow

时间:2024-03-11 09:09:27 235浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《Go语言中如何使用Azure AD获取OAuth2.0访问令牌?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在尝试使用 Go 使用 Azure 服务总线实体。通过提供 SAS 令牌或 Azure AD OAuth2.0 令牌(将通过 Azure AD 应用程序的安全主体获取),可以使用 Azure 服务总线进行身份验证。从技术上讲,我更喜欢安全主体选项而不是 SAS 令牌,因为它存在安全漏洞。

如何使用无法使用 Azure AD SDK 的 Go 从 Azure AD 获取 OAuth2.0 令牌?

是否可以直接调用 Azure AD REST API 来访问 OAuth2.0 令牌?


正确答案


有一些方法可以使用 go 获取访问令牌。

1。使用http请求

例如 authorization code flow,整个代码示例 here:

func gettokens(c authorizationconfig, authcode authorizationcode, scope string) (t tokens, err error) {
    formvals := url.values{}
    formvals.set("code", authcode.value)
    formvals.set("grant_type", "authorization_code")
    formvals.set("redirect_uri", c.redirecturl())
    formvals.set("scope", scope)
    if c.clientsecret != "" {
        formvals.set("client_secret", c.clientsecret)
    }
    formvals.set("client_id", c.clientid)
    response, err := http.postform(tokenurl, formvals)

    if err != nil {
        return t, errors.wrap(err, "error while trying to get tokens")
    }
    body, err := ioutil.readall(response.body)

    if err != nil {
        return t, errors.wrap(err, "error while trying to read token json body")
    }

    err = json.unmarshal(body, &t)
    if err != nil {
        return t, errors.wrap(err, "error while trying to parse token json body")
    }

    return
}

2。使用MSAL Go

// 1.1 Initializing a public client:
publicClientApp, err := public.New("client_id", public.WithAuthority("https://login.microsoftonline.com/Enter_The_Tenant_Name_Here"))

// 1.2 Initializing a confidential client:
confidentialClientApp, err := confidential.New("client_id", cred, confidential.WithAuthority("https://login.microsoftonline.com/Enter_The_Tenant_Name_Here"))

// 2. MSAL comes packaged with an in-memory cache. Utilizing the cache is optional, but we would highly recommend it.
var userAccount public.Account
accounts := publicClientApp.Accounts()
if len(accounts) > 0 {
    // Assuming the user wanted the first account
    userAccount = accounts[0]
    // found a cached account, now see if an applicable token has been cached
    result, err := publicClientApp.AcquireTokenSilent(context.Background(), []string{"your_scope"}, public.WithSilentAccount(userAccount))
    accessToken := result.AccessToken
}

// 3. If there is no suitable token in the cache, or you choose to skip this step, now we can send a request to AAD to obtain a token.
result, err := publicClientApp.AcquireToken"ByOneofTheActualMethods"([]string{"your_scope"}, ...(other parameters depending on the function))
if err != nil {
    log.Fatal(err)
}
accessToken := result.AccessToken

最后,Azure SDK for Go似乎用于通过azure进行身份验证,但它没有提供获取访问令牌的sdk方法。

今天关于《Go语言中如何使用Azure AD获取OAuth2.0访问令牌?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>