首页 > 解决方案 > 设备检查 API:错误:无法验证授权令牌

问题描述

我正在使用Xcode10Swift 5SwiftJWT生成JSON Web token以进行身份​​验证Device Check API。下面是方法

let key8 = """
-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCq...
-----END PRIVATE KEY-----
"""

let myHeader = Header(kid: m_key)
struct MyClaims: Claims {
  let iat: Date
  let iss: String
}

var jwt = JWT(header: myHeader, claims: MyClaims(iat: Date(timeIntervalSinceNow: 3600), iss: m_iss))
    let privateKey = key8.data(using: .utf8)!
    let rsaJWTEncoder = JWTEncoder(jwtSigner: JWTSigner.es256(privateKey: privateKey))
    do {
        let jwtString = try rsaJWTEncoder.encodeToString(jwt)

        print("endcode header: \(jwtString)")
    } catch {
        print("Failed to encode JWT: \(error)")
    }
}

得到类似的结果eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIs...

使用上述标头连接 Apple 服务器。我不断从 Apple 的服务器收到此响应:401 Unable to verify authorization token.

我也在尝试从jwt创建 JSON Web 令牌

但同样的错误。任何帮助,将不胜感激。提前致谢

标签: iosswiftxcode10.2swift5.1devicecheck

解决方案


我尝试了多种方法来解决这个问题。但是什么对我有用,在这里逐步描述如何使用DeviceCheckAPI 获取设备的两位状态。

第 1 步 - 生成令牌

let currentDevice = DCDevice.current
if currentDevice.isSupported {
currentDevice.generateToken(completionHandler: { (data, error) in
    if let tokenData = data {
        print("Token: \(tokenData)")
    } else {
        print("Error: \(error?.localizedDescription ?? "")")
    }
})
}

第 2 步 - 访问和修改每个设备的数据

创建 APNs 身份验证令牌签名密钥

1- 在您的开发者帐户中,转到Certificates, Identifiers & Profiles

2 - 在键下,选择全部,然后单击右上角的添加按钮 (+)。

3- 在密钥描述下,输入签名密钥的唯一名称。

4- 在 Key Services 下,选中 APNs 复选框,然后单击 Continue。

5- 查看密钥配置,然后单击确认。

6- (可选)单击下载以立即生成并下载密钥。如果您下载密钥,它会保存为具有 .p8 文件扩展名的文本文件。将文件保存在安全的地方,因为密钥未保存在您的开发者帐户中,您将无法再次下载它。

7- 单击完成。

第 3 步 - 为查询请求创建有效负载

func generateJWTToken() -> String{

     let key8 = """
     -----BEGIN PRIVATE KEY-----

    MIGTAgEAMBMGByqGSM49...
    -----END PRIVATE KEY-----
    """

    let myHeader = Header(kid: "2YHFSDF45")

    let timeStamp = Date.currentTimeStamp
    let teamId = "xyz"

    let jwt = JWT(header: myHeader, claims: MyClaims(iat:timeStamp, iss: teamId))

    let privateKey = key8.data(using: .utf8)!
    let rsaJWTEncoder = JWTEncoder(jwtSigner: JWTSigner.es256(privateKey: privateKey))

    do {
        let jwtString = try rsaJWTEncoder.encodeToString(jwt)

        //print(jwtString)

        return jwtString
    } catch {
        print("Failed to encode JWT: \(error)")
    }

    return ""
}

第 4 步 - 查询 DeviceCheckApi

要获取设备的两位状态,我们将使用Alamofirehttps://api.devicecheck.apple.com/v1/query_two_bits发出 HTTP 请求

    //MARK:- method call device check API
func callAppleDeviceCheckApi(_ token: String){

    let mUrl : URL = NSURL(string: "https://api.devicecheck.apple.com/v1/query_two_bits") as! URL

    let mHeaders = generateJWTToken()
    let mDeviceToken = token
    let mTimeStampMili = Date.currentTimeStampMili

    let headers: HTTPHeaders = ["Authorization": "Bearer "+mHeaders,
                                "Content-Type" : "application/json"]

    let params = ["device_token": mDeviceToken, "transaction_id": "dfgsdfgddfc", "timestamp": mTimeStampMili] as [String : Any]

    var request = URLRequest(url: mUrl)
    request.httpMethod = "POST"

    request.headers = headers

    request.httpBody = try! JSONSerialization.data(withJSONObject: params)
    AF.request(request).responseString(){
        response in

        switch response.result {
        case .success(let value):

            let json = JSON(value)

            //print("JSON: \(json)") 

        case .failure(let error):
            print("ERROR: \(error)")

        }
    }
}

注意-通过这个这个以获得更好的理解。


推荐阅读