通用打印(UP)打印机注册
1. 注册
1.1 流
1.2 API
全局 UP 注册服务可用于注册打印机的以下 API。
全局 UP 注册服务基 URL: https://register.print.microsoft.com
完整 URL 将是以下全局基 URL 和终结点的组合。
1.2.1 /register
/register 终结点用于注册打印机。 注册有 2 个阶段。
注册打印机的初始注册调用
轮询注册状态以完成注册请求
1.2.1.1 启动注册
第一个阶段是使用全局注册服务启动注册请求。 为此,请使用 JSON 格式的注册有效负载向 /register 终结点发出 POST 请求。
1.2.1.1.1 HTTP 请求
POST /api/{version}/register
{version}
是打印机正在使用的 UP 注册 API/协议的版本。
当前支持的版本包括:
- v1.0
1.2.1.1.2 请求标头
对于 v1.0:
名称 | 说明 |
---|---|
授权 | 持有者 {token} 必需。 打印机必须按照设备代码流或其他授权流登录管理员以Microsoft Entra ID。 |
1.2.1.1.3 请求内容类型
application/json
1.2.1.1.4 请求有效负载
注册请求有效负载采用 JSON 格式,具有以下值(区分大小写):
值名称 | 值类型 | 说明 | 必需 |
---|---|---|---|
name | string | 打印机的友好名称。 | 是 |
制造商 | string | 打印机的制造商。 | 是 |
模型 | string | 打印机的模型。 | 是 |
device_id | string | 打印机的物理设备 UUID。 | 是 |
device_type | string | 设备的类型。 支持的值(不含引号):“printer” | 是 |
certificate_request | DeviceCertRequest 对象 | 打印机创建的证书的 X.509 证书签名请求(CSR)用于标识自身。 有关如何使用 BouncyCastle .NET 库创建 CSR 的编码示例,请参阅附录 A.1。 | 是 |
DeviceCertRequest 对象具有以下值(区分大小写):
值名称 | 值类型 | 说明 | 必需 |
---|---|---|---|
type | string | 必须包含“pkcs10”的属性。 | 是 |
data | string | 包含 base64 编码的 PKCS#10 证书请求 RFC4211的属性。 证书请求必须使用具有 2048 位密钥的 RSA 公钥算法、SHA256WithRSAEncryption 签名算法和 SHA256 哈希算法。 | 是 |
transport_key | string | 由客户端生成的非对称密钥的 base64 编码的公共部分。 | 是 |
1.2.1.1.5 成功响应
成功(202 已接受),注册响应有效负载将以 JSON 格式,具有以下值(区分大小写):
值名称 | 值类型 | 说明 | 必须 |
---|---|---|---|
registration_id | string | 表示此注册请求的唯一 ID。 轮询注册状态时将使用此方式。 | 是 |
interval | integer | 轮询间隔时间(以秒为单位),以检查注册请求的完成情况。 | 是 |
1.2.1.1.6 错误响应
出错时,将返回以下 HTTP 状态代码以及错误响应有效负载。 错误响应有效负载将包含第 2 节中采用格式的错误 JSON 对象。
HTTP 状态代码
HTTP 状态代码 | 说明 |
---|---|
400(错误请求) | 请求无效或格式不正确。 有关详细信息,请参阅错误响应有效负载。 修复并重新发送请求。 |
500(内部服务器错误) | 服务中发生了内部错误。 有关详细信息,请参阅错误响应有效负载。 重试请求(如果可能,将设置retry_timeout)。 |
错误代码
错误代码 | 说明 | HTTP 状态代码 |
---|---|---|
invalid_request | 注册请求有效负载格式不正确/无效。 这通常在开发阶段发生。 有关详细信息,请参阅error_description。 | 400 |
device_code_error | 该服务无法生成设备/用户代码对。 | 500 |
storage_error | 该服务在后端存储中遇到错误。 | 500 |
service_error | 服务中出错。 有关详细信息,请参阅error_description。 | 500 |
1.2.1.1.7 示例
1.2.1.1.7.5 请求 v1.0
POST https://register.print.microsoft.com/api/v1.0/register HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkZ6U3pHTVZ1a0U2Nm9EQnpwR0JUY2NBMlVRYyIsImtpZCI6IkZ6U3pHTVZ1a0U2Nm9EQnpwR0JUY2NBMlVRYyJ9.eyJhdWQiOiJodHRwczovL3ByaW50LnByaW50LXBwZS5taWNyb3NvZnQuY29tIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy1wcGUubmV0LzIwZGY5NTlmLWE0OTItNGU3NC05N2E3LTE0YWJiM2ZlZjFkYi8iLCJpYXQiOjE1NjE2NzUxNjYsIm5iZiI6MTU2MTY3NTE2NiwiZXhwIjoxNTYxNjc5MDY2LCJhY3IiOiIxIiwiYWlvIjoiNDJOZ1lOQXNYbUtTSHZSM3Jvcjd2RVdMMWtmc0NMUi93R085cjYzMGl2T1RLWlVoV1ZzQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiI0MTdhZTZlYi1hYWM4LTQyYzgtOTAwYy0wZTUwZGViYmE2ODgiLCJhcHBpZGFjciI6IjAiLCJmYW1pbHlfbmFtZSI6IlN0YWdlciIsImdpdmVuX25hbWUiOiJNYWRlbGluZSIsImdyb3VwcyI6WyI1YjljNGVkMS0yMWUyLTRkNzktYjE0Zi1mMzYyMTI5ODcyYjIiXSwiaXBhZGRyIjoiMTMxLjEwNy4xNTkuMjAiLCJuYW1lIjoiTWFkZWxpbmUgU3RhZ2VyIiwib2lkIjoiYzJmMjg2NDctMWQ4ZS00YTdhLWIzZjctZjU4YmQ3ODYxODk4IiwicHVpZCI6IjEwMDM0MDAwMDA2OEJFQzgiLCJzY3AiOiJzYW1wbGVzLnJlYWQgc2FtcGxlcy53cml0ZSIsInN1YiI6IlR6b2hRcmNzTHNjNUNHR09hWndxa1ZiajhaSkh4MnB1dzdpcWhWVXFWRGsiLCJ0ZW5hbnRfY3RyeSI6IlVTIiwidGlkIjoiMjBkZjk1OWYtYTQ5Mi00ZTc0LTk3YTctMTRhYmIzZmVmMWRiIiwidW5pcXVlX25hbWUiOiJtYXN0YWdlckBjbG91ZHByaW50cHBlLmNjc2N0cC5uZXQiLCJ1cG4iOiJtYXN0YWdlckBjbG91ZHByaW50cHBlLmNjc2N0cC5uZXQiLCJ1dGkiOiJlal84QlAtLW1rZWNNWjdncFJNR0FBIiwidmVyIjoiMS4wIiwid2lkcyI6WyI2MmU5MDM5NC02OWY1LTQyMzctOTE5MC0wMTIxNzcxNDVlMTAiXX0.e1RpyZDQzqlV11uyRXWRmaqf6wk2mg763muoIiMG2Qq8DW221Rg91cLP5px6KSfhpd7nv-Ln_KUFsZ4IlJqfmsrfCL_vgKHjYQuRDv2BY8-vrIqUC_5XVA_sj2Ib7iT7SjDYyMv6QDZM2rf7kVggvRuaZihUxxGZWby84EXD8KKAYfAQGo3r6AceuSDJOvToMy-Kp-MEqRuzExZdq2p1_qRIBtHe8Its4xuR8ZHEVqWnY0Y_qeVA8uxl3mQxZSvH8BVYn4Bdy_VZcNtrNKt3YpHFzG4kgy5V6wGLecRI7IBzYd4uK_FwpaYXHpkrSbO0ATEX3tjrgPnHbicA053Ilw
Content-Length: 1600
{
"name": "Test Printer",
"manufacturer": "Test Manufacturer",
"model": "Test Model",
"device_type": "printer",
"device_id": "a188d9e8-8daa-44c9-862b-d6202bcf1b68",
"certificate_request":
{
"type": "pkcs10",
"data": "MIICpDCCAYwCAQAwYTELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1JlZG1vbmQxFzAVBgNVBAoMDk1pY3Jvc29mdCBDb3JwMRIwEAYDVQQDDAlNaWNyb3NvZnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDJ1xUdFKBlFdS9dHqSrD7YS0ZJ6MgcYy5wI3P0wOWrDi28OCBLbt6HBg02KDh1MlmVrfIR2O6WWeJ59M63JuwEn2e2WoGnIb/M6NyANyBBmgZ3bjp39UJHbXtYYXm/VJrPcOLM09dST7KR1zAcD2J+rnK8ZVUtYuTl58D7R6zsrYshw5CwxfLYPXeXwiSoKhtEC8Xn1lz3mi5B2SdsFHdjaQb6E0tCG5zdrVzzhCEVPaoo4e9SCTB9jDNulTU1ZkHzGBk+UzlKv4APsclyGCTEgA01T6/ueBrVeKY9d4DYfz/pu4sm0Vf1E+2hggtwbBOP60sFtkfnKiwtVoDF1KC9AgMBAAEwDQYJKoZIhvcNAQELBQADggEBACdggPBJ5MoJJ3QjVYDypuJGWDVWBT0G4pXNZHNz5Q4OVDze7aCw3Sl78Qdzy++XsrSXjtyZyEb+A5R36YKTpzRBCHSOWyZkZKpxj0Uo8/+RzjzJ1uvtwfhelfQ6EVktFsz6a2hixcaa47bN/bjj9stJbbRsxjJwR1K5YI/i+9DaUE7r7VDXiknQ7/ZyEYquAqY/O/LEnFOGhkSvkLlFPTbnJ7fzURyNnQhmp8p3DMj5dXYgKfWPxViqvJChx8pJf9zM4TjzaTZIj08tSOp2LtWGeMNkFgYJH4URe3t4OPx5crkKj8i5aIW1Ulb8ezJLW1IU7W8hF71ooZWFTOsAnjQ=",
"transport_key":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAydcVHRSgZRXUvXR6kqw+2EtGSejIHGMucCNz9MDlqw4tvDggS27ehwYNNig4dTJZla3yEdjullniefTOtybsBJ9ntlqBpyG/zOjcgDcgQZoGd246d/VCR217WGF5v1Saz3DizNPXUk+ykdcwHA9ifq5yvGVVLWLk5efA+0es7K2LIcOQsMXy2D13l8IkqCobRAvF59Zc95ouQdknbBR3Y2kG+hNLQhuc3a1c84QhFT2qKOHvUgkwfYwzbpU1NWZB8xgZPlM5Sr+AD7HJchgkxIANNU+v7nga1XimPXeA2H8/6buLJtFX9RPtoYILcGwTj+tLBbZH5yosLVaAxdSgvQIDAQAB"
}
}
1.2.1.1.7.6 响应 v1.0
HTTP/1.1 202 Accepted
Date: Thu, 27 Jun 2019 22:47:34 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
{
"registration_id": "fbbd6371-7e88-4881-8818-8d2ea2e8fe88",
"interval": 5
}
1.2.1.2 获取注册状态
成功接受注册请求后,打印机将轮询 /register
终结点以获取注册请求的状态。 打印机应根据注册响应中收到的间隔值轮询,并且必须提供收到的值 registration_id
。
1.2.1.2.1 HTTP 请求
GET /api/{version}/register?{Query Parameters}
{version}
是打印机正在使用的 UP 注册 API/协议的版本。
当前支持的版本包括:
- v1.0
{Query Parameters}
在下一节中指定。
1.2.1.2.2 请求标头
对于 v1.0:
名称 | 说明 |
---|---|
授权 | 持有者 {token} 必需。 打印机必须登录管理员才能Microsoft Entra ID,或按照设备代码流操作。 可以使用为第一个注册请求获取的相同令牌。 |
1.2.1.2.3 请求查询参数
参数名称 | 说明 | 必须 |
---|---|---|
registration_id | 从注册请求的响应收到的注册 ID。 | 是 |
1.2.1.2.4 成功响应
以下“成功”方案将返回以下 HTTP 状态代码:
HTTP 状态代码 | 注册阶段 |
---|---|
200(正常) | 注册完成 |
202 (已接受) | 正在进行注册 - 请在间隔时间过后发出另一个请求 |
响应有效负载
正在进行注册(202 已接受):
注册响应有效负载采用 JSON 格式,具有以下值(区分大小写):
值名称 | 值类型 | 说明 | 必须 |
---|---|---|---|
interval | integer | 轮询间隔时间(以秒为单位),以检查注册请求的完成情况。 请注意,每次都不需要轮询间隔时间。 | 是 |
注册完成(200 正常):
注册响应有效负载采用 JSON 格式,具有以下值(区分大小写):
值名称 | 值类型 | 说明 | 必须 |
---|---|---|---|
cloud_device_id | string | 此打印机表示的云中打印机的 UUID。 | 是 |
证书 (certificate) | string | Base64 编码的已签名 X.509 证书。 | 是 |
print_svc_url | string | 处理打印机操作的通用打印(UP)服务的 URL。 | 是 |
notification_url | string | 打印机应使用的 URL 侦听通知(新打印作业、取消打印作业等)。。 | 是 |
mcp_svc_resource_id | string | UP 服务的资源 ID。 请求 OAuth 令牌以与 UP 和 UP 通知服务通信时是必需的。 | 是 |
device_token_url | string | 打印机应用于获取 UP 和 UP 通知服务的令牌的安全令牌颁发机构(STA)的 URL。 | 是 |
1.2.1.2.5 错误响应
出错时,将返回以下 HTTP 状态代码以及错误响应有效负载。 错误响应有效负载将包含第 2 节中采用格式的错误 JSON 对象。
HTTP 状态代码
HTTP 状态代码 | 说明 |
---|---|
400(错误请求) | 请求无效或格式不正确。 有关详细信息,请参阅错误响应有效负载。 应重新启动注册。 |
500(内部服务器错误) | 服务中发生了内部错误。 有关详细信息,请参阅错误响应有效负载。 应重新启动注册。 |
错误代码
错误代码 | 说明 | HTTP 状态代码 |
---|---|---|
invalid_registration_id | 提供的注册 ID 无效。 如果注册 ID 存储不正确,或者打印机注册未在注册超时内完成,则可能会出现这种情况。 应重新启动注册。 | 400 |
device_already_exists | 已注册的设备已注册。 管理员应检查 UP 门户,查看已注册的设备是否存在。 如果是,可能是管理员忘记删除/取消注册的过时条目。 应重新启动注册。 | 400 |
user_token_error | 服务无法获取用户令牌来执行注册。 应重新启动注册。 | 500 |
storage_error | 该服务在后端存储中遇到错误。 应重新启动注册。 | 500 |
service_error | 服务中出错。 有关详细信息,请参阅error_description。 应重新启动注册。 | 500 |
1.2.1.2.6 示例
1.2.1.2.6.3 请求 v1.0
GET https://register.print.microsoft.com/api/v1.0/register?registration_id=bb86db79-2918-
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IkZ6U3pHTVZ1a0U2Nm9EQnpwR0JUY2NBMlVRYyIsImtpZCI6IkZ6U3pHTVZ1a0U2Nm9EQnpwR0JUY2NBMlVRYyJ9.eyJhdWQiOiJodHRwczovL3ByaW50LnByaW50LXBwZS5taWNyb3NvZnQuY29tIiwiaXNzIjoiaHR0cHM6Ly9zdHMud2luZG93cy1wcGUubmV0LzIwZGY5NTlmLWE0OTItNGU3NC05N2E3LTE0YWJiM2ZlZjFkYi8iLCJpYXQiOjE1NjE2NzUxNjYsIm5iZiI6MTU2MTY3NTE2NiwiZXhwIjoxNTYxNjc5MDY2LCJhY3IiOiIxIiwiYWlvIjoiNDJOZ1lOQXNYbUtTSHZSM3Jvcjd2RVdMMWtmc0NMUi93R085cjYzMGl2T1RLWlVoV1ZzQSIsImFtciI6WyJwd2QiXSwiYXBwaWQiOiI0MTdhZTZlYi1hYWM4LTQyYzgtOTAwYy0wZTUwZGViYmE2ODgiLCJhcHBpZGFjciI6IjAiLCJmYW1pbHlfbmFtZSI6IlN0YWdlciIsImdpdmVuX25hbWUiOiJNYWRlbGluZSIsImdyb3VwcyI6WyI1YjljNGVkMS0yMWUyLTRkNzktYjE0Zi1mMzYyMTI5ODcyYjIiXSwiaXBhZGRyIjoiMTMxLjEwNy4xNTkuMjAiLCJuYW1lIjoiTWFkZWxpbmUgU3RhZ2VyIiwib2lkIjoiYzJmMjg2NDctMWQ4ZS00YTdhLWIzZjctZjU4YmQ3ODYxODk4IiwicHVpZCI6IjEwMDM0MDAwMDA2OEJFQzgiLCJzY3AiOiJzYW1wbGVzLnJlYWQgc2FtcGxlcy53cml0ZSIsInN1YiI6IlR6b2hRcmNzTHNjNUNHR09hWndxa1ZiajhaSkh4MnB1dzdpcWhWVXFWRGsiLCJ0ZW5hbnRfY3RyeSI6IlVTIiwidGlkIjoiMjBkZjk1OWYtYTQ5Mi00ZTc0LTk3YTctMTRhYmIzZmVmMWRiIiwidW5pcXVlX25hbWUiOiJtYXN0YWdlckBjbG91ZHByaW50cHBlLmNjc2N0cC5uZXQiLCJ1cG4iOiJtYXN0YWdlckBjbG91ZHByaW50cHBlLmNjc2N0cC5uZXQiLCJ1dGkiOiJlal84QlAtLW1rZWNNWjdncFJNR0FBIiwidmVyIjoiMS4wIiwid2lkcyI6WyI2MmU5MDM5NC02OWY1LTQyMzctOTE5MC0wMTIxNzcxNDVlMTAiXX0.e1RpyZDQzqlV11uyRXWRmaqf6wk2mg763muoIiMG2Qq8DW221Rg91cLP5px6KSfhpd7nv-Ln_KUFsZ4IlJqfmsrfCL_vgKHjYQuRDv2BY8-vrIqUC_5XVA_sj2Ib7iT7SjDYyMv6QDZM2rf7kVggvRuaZihUxxGZWby84EXD8KKAYfAQGo3r6AceuSDJOvToMy-Kp-MEqRuzExZdq2p1_qRIBtHe8Its4xuR8ZHEVqWnY0Y_qeVA8uxl3mQxZSvH8BVYn4Bdy_VZcNtrNKt3YpHFzG4kgy5V6wGLecRI7IBzYd4uK_FwpaYXHpkrSbO0ATEX3tjrgPnHbicA053Ilw
Host: register.print.microsoft.com
1.2.1.2.6.4 正在进行响应 v1.0
HTTP/1.1 202 Accepted
Cache-Control: no-cache
Pragma: no-cache
{
"interval": 15
}
1.2.1.2.6.7 已完成响应 v1.0
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Length: 267
Content-Type: application/json; charset=utf-8
{
"cloud_device_id": "7c907b43-d8f0-4e42-a279-1e37eb4fd2bf",
"certificate": "MIID8jCCAtqgAwIBAgIQR2Y15zkurJhCGxcaQ0d7tjANBgkqhkiG9w0BAQsFADB4MXYwEQYKCZImiZPyLGQBGRYDbmV0MBUGCgmSJomT8ixkARkWB3dpbmRvd3MwHQYDVQQDExZNUy1Pcmdhbml6YXRpb24tQWNjZXNzMCsGA1UECxMkODJkYmFjYTQtM2U4MS00NmNhLTljNzMtMDk1MGMxZWFjYTk3MB4XDTE4MDExOTAwNTIxM1oXDTI4MDExOTAxMjIxM1owLzEtMCsGA1UEAxMkZjVlYjVmNWUtMDYyNC00YTNiLThmZjItNjQ5ZTAyM2ZiNzJkMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApQc0Twp+vlT5Vc74zLoXbrufcIKnoW980OWFKHf7lRlRqjj9MWpea99j+3K8JQSoifXJvS5QzyjXrH9phsrfX84I258y6dM/aUadLYYKjO38wx9c1vQppZi1P3LcDaJiXPgNQ8omWCtDNoVwQlTUmB9Pq6h+V6S4P59Mq9cem6yEE7pu4DLqLSB68jexvLQnuGDfn6PsVUC3ML21zDmAr3QDikiZDe9Iy03IRrXvl6obj5QZtkGFbK9ueArFcWpymsEK
FfVhrKL7ca/rAEFHsHacJYHkJNMw3Qzs0yMYZRsH/fS+eBebvQWUEujQ+BX8xZQX48ukwtC8R37RsqrLjwIDAQABo4HAMIG9MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwIgYLKoZIhvcUAQWCHAIEEwSBEF5f6/UkBjtKj/JkngI/ty0wIgYLKoZIhvcUAQWCHAMEEwSBEHXH6W+38IhBoi1uqlWcNhUwIgYLKoZIhvcUAQWCHAUEEwSBEAWT1qlxl5pLvXhzFTIfL2swFAYLKoZIhvcUAQWCHAgEBQSBAk5BMBMGCyqGSIb3FAEFghwHBAQEgQEwMA0GCSqGSIb3DQEBCwUAA4IBAQCXpFMa9DCgIIJTD3RlEyPN8WB/HgMkhLBqwtZugkmIn8D80ckuhrfa2jJfWkNxEfFXanjq9B4tAvkNt7vBXiYw+PKj8+CE5FgfUTNtIw3Q/06tnJBj20mz28ZNbdRUgXzxXiY7oZss54dbHH+7TFO9k9Pm1CuUOzLFX4LeC48wo/S6uN7JDeID6pQjcR00eYJ+gcD800AXBYXrqSreYhdtl1swcD71qgshELAo2qXu0kzuKj05GIB5SXFOoU+KhuB0LMuEZF5rsQPN4KcasGaAb/8MIORAxkYStNLQZQLYbDve/dUownbfruW/o3tnjJP0GA0gY/Ohv5ssgrCFsiBq",
"print_svc_url": "https://print.print.microsoft.com/",
"notification_url": "https://notification.print.microsoft.com/",
"mcp_svc_resource_id":"https://print.print.microsoft.com",
"device_token_url": "https://login.microsoftonline.com/common/oauth2/token"
}
1.2.1.3 身份验证
注册打印机之前,必须先按照设备代码流或其他授权流对管理员进行身份验证才能Microsoft Entra ID。 获取的打印机管理员访问令牌必须在请求的授权标头中发送以注册打印机。 可在支持的身份验证流中找到 Microsoft Entra ID 支持的设备代码和其他身份验证流的文档。
1.2.1.3.1 设备代码流参数
可以在 OAuth 2.0 设备代码流中找到Microsoft条目 ID 支持的文档。 下面 client_id
列出的是临时的。 我们将在不久的将来提供其他信息。
参数名称 | 说明 | 必须 |
---|---|---|
tenant | 对租户参数使用“组织”。 | 是 |
client_id | 用于 registered client ID client_id。 注册 OEM 客户端的其他信息。 |
是 |
scope | 用于 https://print.print.microsoft.com/.default 范围 |
是 |
1.2.1.3.2 示例设备代码流请求
1.2.1.3.2.1 启动设备代码流
请求:
POST https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode HTTP/1.1
Accept-Charset: utf-8
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: login.microsoftonline.com
Content-Length: 103
Expect: 100-continue
Connection: Keep-Alive
client_id=<registered_client_id>&scope=https%3A%2F%2Fprint.print.microsoft.com%2F.default
响应:
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Content-Length: 473
{
"user_code": "FMTB7B3WR",
"device_code": "FAQABAAEAAAAP0wLlqdLVToOpA4kwzSnx3SB1wjNptiBt5jFM8ePgJKGOjX-WOEksHYT3zgqz9VVg4MqY8J6Tej_rpniyj4WjOsVe-RCJuGexX-IwPKDK-df38P0zpLv5ktxSCflT_F-8Cbef6BRDpk0Qm-lPOhC4bcbtdIaM8yqf-cS962rGC9VdVNFVFStePppCDRcumjAgAA",
"verification_uri": "https://microsoft.com/devicelogin",
"expires_in": 900,
"interval": 5,
"message": "To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code FMTB7B3WR to authenticate."
}
1.2.1.3.2.2 检索用户令牌
请求:
POST https://login.microsoftonline.com/tenant/oauth2/v2.0/token HTTP/1.1
Accept-Charset: utf-8
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: login.microsoftonline.com
Content-Length: 289
Expect: 100-continue
grant_type=device_code&client_id=<registered_client_id>&device_code=FAQABAAEAAAAP0wLlqdLVToOpA4kwzSnx3SB1wjNptiBt5jFM8ePgJKGOjX-WOEksHYT3zgqz9VVg4MqY8J6Tej_rpniyj4WjOsVe-RCJuGexX-IwPKDK-df38P0zpLv5ktxSCflT_F-8Cbef6BRDpk0Qm-lPOhC4bcbtdIaM8yqf-cS962rGC9VdVNFVFStePppCDRcumjAgAA
响应: authorization_pending
用户尚未登录。
HTTP/1.1 400 Bad Request
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Content-Length: 469
{
"error": "authorization_pending",
"error_description": "AADSTS70016: Pending end-user authorization.\r\nTrace ID: 60997c8b-15ed-4d12-99b6-6da879fd1400\r\nCorrelation ID: 7300aba9-1698-4a4e-b6dd-66459a828108\r\nTimestamp: 2019-09-26 23:13:43Z",
"error_codes": [70016],
"timestamp": "2019-09-26 23:13:43Z",
"trace_id": "60997c8b-15ed-4d12-99b6-6da879fd1400",
"correlation_id": "7300aba9-1698-4a4e-b6dd-66459a828108",
"error_uri": https://login.microsoftonline.com/error?code=70016
}
响应: success
用户已登录,将返回令牌。 发送请求向通用打印注册打印机时,可以在所需的授权标头(第 1.2.1.1.2 节中所述)中使用此令牌。
HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Content-Length: 1763
{
"token_type": "Bearer",
"scope": "https://print.print.microsoft.com/Print.Device https://print.print.microsoft.com/.default",
"expires_in": 3599,
"ext_expires_in": 3599,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImFQY3R3X29kdlJPb0VOZzNWb09sSWgydGlFcyIsImtpZCI6ImFQY3R3X29kdlJPb0VOZzNWb09sSWgydGlFcyJ9.eyJhdWQiOiJodHRwczovL3ByaW50LnByaW50Lm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC9mMGQ4ODMyMy04OGY2LTQ4MTMtOGI0ZC05NGVjNjdlNjA3YmQvIiwiaWF0IjoxNTY5NTM5Mzc3LCJuYmYiOjE1Njk1MzkzNzcsImV4cCI6MTU2OTU0MzI3NywiYWNyIjoiMSIsImFpbyI6IkFTUUEyLzhNQUFBQVA1U1NzTklCYXRVQ2UxSGZXaEdvNHhqbUM4b2RCckNpeDNaN0dyZWJUMEE9IiwiYW1yIjpbInB3ZCJdLCJhcHBpZCI6IjQxN2FlNmViLWFhYzgtNDJjOC05MDBjLTBlNTBkZWJiYTY4OCIsImFwcGlkYWNyIjoiMCIsImdyb3VwcyI6WyIzMjVhNDljOS1mNjQ0LTQxNjEtODdmZS1kZTQ5ZGEyNDhjZTkiXSwiaXBhZGRyIjoiMTY3LjIyMC4yLjE4IiwibmFtZSI6Ik1hZGVsaW5lIFN0YWdlciIsIm9pZCI6ImIzZTE1ODM0LTAxZmUtNDIwNi05MjkwLTk5OTNiMzM1MWM2MSIsInB1aWQiOiIxMDAzN0ZGRUFDRjVBNUE1Iiwic2NwIjoiUHJpbnQuRGV2aWNlIiwic3ViIjoiN2hhQzVjdEZlYjZPVHBsMHROUDJmRDJVY3pWTFRjbTZlNkQ1eEZkOEpvYyIsInRlbmFudF9jdHJ5IjoiVVMiLCJ0aWQiOiJmMGQ4ODMyMy04OGY2LTQ4MTMtOGI0ZC05NGVjNjdlNjA3YmQiLCJ1bmlxdWVfbmFtZSI6Im1hc3RhZ2VyQGNsb3VkcHJpbnRwcm9kdWN0aW9uLm9ubWljcm9zb2Z0LmNvbSIsInVwbiI6Im1hc3RhZ2VyQGNsb3VkcHJpbnRwcm9kdWN0aW9uLm9ubWljcm9zb2Z0LmNvbSIsInV0aSI6Inp2N2EtdGRrR0VHQkFSMl9zWU1UQUEiLCJ2ZXIiOiIxLjAiLCJ3aWRzIjpbIjYyZTkwMzk0LTY5ZjUtNDIzNy05MTkwLTAxMjE3NzE0NWUxMCJdfQ.Nfz82GPdQUx6py2xwhVhI4hvpbLTdaaDSVFnGx4Eb3CeJHcQvCmmKoB9Lze7YITcEcLdxUkGEQGEXSh6M3yDrNP_hsoIROdWhe6RDjbYVPmJUL319lL4eNtQTJq8bKcJVbeM5SamlY1mBIhxH_sjL4TX0NN2RnDIuF_L1NSRW0IaHoZxzf257y0n7BqPROl3VpQ97wA8P-hhVBbfwwB9i-sLbsoCVszuE9JnHpgJPm6h9FDL9Px57ddTMZDvJchxOL5gUTA76gdRqUUzLROCMlz0R7vTJotl2RQnrzZBoNNoM9iJHL2KqQKuuezHEro1453lSRASiBkZHHEOFglzSg"
}
2. 错误响应结构
对于上述 API,在错误时,以下错误结构将以 JSON 格式返回,并具有以下值(区分大小写)。 这些错误响应主要用于开发目的,由开发人员向用户显示的内容(如果有)。
值名称 | 值类型 | 说明 | 必须 |
---|---|---|---|
error | string | 错误代码字符串,用于对所发生的错误类型进行分类。 | 是 |
error_description | string | 一条特定的错误消息,可帮助标识错误的根本原因。 | 否 |
error_code | integer | 有助于诊断问题的其他错误代码。 | 否 |
http_status_code | integer | 返回并出现此错误响应的 HTTP 状态代码。 | 否 |
retry_timeout | integer | 打印机在重试请求之前应等待的秒数。 | 否 |
上面的每个 API 都会列出其可能的错误代码字符串(s)。
2.1 示例响应
{
"error": "invalid_request",
"error_description": "Missing required field device_type"
}
打印机注册后与通用打印服务的连接
通用打印支持 PWG 5100.18(IPP 基础结构)中定义的必需功能。 通用打印就绪打印机在完成打印机注册过程后,应使用此协议与通用打印通信。 为了确保调用方是具有访问权限的打印机,打印机将使用设备访问令牌,如打印机访问令牌检索中所述,作为 HTTP Authorization
标头的持有者值。