【问题标题】:Device check API: Error: Unable to verify authorization token设备检查 API:错误:无法验证授权令牌
【发布时间】:2019-09-23 12:56:09
【问题描述】:

我正在使用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...的结果

使用上面的 header 连接 Apple 服务器。我不断收到来自 Apple 服务器的回复:401 Unable to verify authorization token

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

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

【问题讨论】:

    标签: ios swift xcode10.2 swift5.1 devicecheck


    【解决方案1】:

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

    第 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 - 在 Keys 下,选择 All 并单击右上角的 Add 按钮 (+)。

    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)")
    
            }
        }
    }
    

    注意-通过thisthis更好地理解。

    【讨论】:

      猜你喜欢
      • 2018-10-31
      • 1970-01-01
      • 2018-02-16
      • 2017-01-11
      • 1970-01-01
      • 2016-09-21
      • 2014-12-16
      • 2018-11-08
      • 2020-07-13
      相关资源
      最近更新 更多