firebase - 如何向 Google 云打印进行身份验证

标签 firebase http printing oauth-2.0 google-cloud-print

我正在制作一个应用程序,需要通过 Google 云打印将打印作业发送到我拥有的两台打印机(即,打印机始终是同一台,不属于用户)。我已经使用 Google 云打印设置了打印机,现在可以从我的 Google 帐户访问它。 enter image description here

现在,如何通过 API 访问此帐户的打印机?我找到了一些文档 here那就是说我在提出请求时需要对自己进行身份验证。 在我看来,身份验证应该用 OAuth2 完成.但是初学者缺乏关于如何做到这一点的说明。我已经获得了我的 OAuth 客户端 ID 和密码(OAuth 链接中的第 1 步)。但是对于第 2 步,我不知道该怎么做。

它说:

Before your application can access private data using a Google API, it must obtain an access token that grants access to that API. A single access token can grant varying degrees of access to multiple APIs.

但没有解释如何获取此访问 token 。我看了this所以问题是 OP 似乎在哪里获得了这个访问 token ,但我不明白他是怎么做到的。

有人可以解释一下如何获取访问 token 以用于 Google 云打印吗?或者解释如何操作的好资源?

附言。打印功能由 firebase 函数触发。考虑到 firebase 也是由 Google 制作的,这是否有助于我们获取访问 token ?

最佳答案

我遇到了同样的问题并提出了这个两步解决方案:

  1. 在您的 Google Cloud Console 中创建一个 OAuth2 客户端如所述here 并从控制台下载其客户端凭据,并将其 json 内容复制并粘贴到下面代码段中的 credJSON
  2. 运行下面的代码。
    • 点击授权链接并授权您的 OAuth2 客户端使用您的 Google 帐户访问 Googel 云打印机。
    • 将授权码复制并粘贴到脚本中
    • 获得刷新 token 后,确保将其存储在变量 refreshToken
    • 不要忘记更新代理名称。
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/google/cloud-print-connector/gcp"
    "github.com/google/cloud-print-connector/lib"
    "github.com/google/uuid"
    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
)

var (
    credJSON     = ``
    refreshToken = ""

    // Find the proxy in the Advanced Details of your printer at https://www.google.com/cloudprint#printers
    proxy = "HP"
)

func main() {
    // Obtain the OAuth config
    config, err := google.ConfigFromJSON([]byte(credJSON), gcp.ScopeCloudPrint)
    if err != nil {
        log.Fatalf("Failed to obtain OAuth config: %v", err)
    }

    // If no request token is present, obtain a new one
    if refreshToken == "" {
        // Get the auth link
        authLink := config.AuthCodeURL(uuid.New().String(), oauth2.AccessTypeOffline)
        log.Printf("Follow the link to obtain an auth code: %s", authLink)

        fmt.Printf("Paste your auth code here: ")
        var code string
        fmt.Scanln(&code)

        // Get a token form the auth code
        token, err := config.Exchange(context.Background(), code, oauth2.AccessTypeOffline)
        if err != nil {
            log.Fatalf("Failed to obtain OAuth token: %v", err)
        }
        if token.RefreshToken != "" {
            refreshToken = token.RefreshToken
        } else {
            refreshToken = token.AccessToken
        }
        log.Printf("Refresh token: %s", refreshToken)
    }

    // Connect to Google Cloud Print
    jobCh := make(chan *lib.Job)
    client, err := gcp.NewGoogleCloudPrint(lib.DefaultConfig.GCPBaseURL, refreshToken, refreshToken, proxy, config.ClientID, config.ClientSecret, config.Endpoint.AuthURL, config.Endpoint.TokenURL, lib.DefaultConfig.NativeJobQueueSize, jobCh, true)
    if err != nil {
        log.Fatalf("Failed to connect to GCP: %v", err)
    }

    // List all printers
    printers, _, err := client.ListPrinters()
    if err != nil {
        log.Fatalf("Failed to list printers: %v", err)
    }
    for _, p := range printers {
        log.Printf("Name: %s UUID: %s", p.Name, p.UUID)
    }
}

关于firebase - 如何向 Google 云打印进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51307302/

相关文章:

javascript - 如何禁用 Windows 打印对话框?

javascript - 使用 JavaScript 在 Firebase 中查找和修改(或删除)匹配节点的精确语法

javascript - 使用 AntDesign 列表和 Firebase Firestore 数据使用react

http - 使用 groovy 和数据发送 POST 已经进行了 URL 编码

php - 如何获取php页面加载时间统计信息?

windows - 如何使用 Windows Phone 7 连接蓝牙打印机?

ios - "This application is modifying the autolayout engine"错误(Swift iOS)

java - Firebase RecyclerView - 如何只显示过滤后的数据?

http - 如何在BlackBerry 5.0 及以上版本的J2ME 代码中使用wifi 调用web 服务?

javascript - 从前端 javascript 打印?