Device check API: Error: Unable to verify authorization token
Device check API: Error: Unable to verify authorization token
我正在使用 Xcode10
、Swift 5
和 SwiftJWT
生成 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 的服务器收到此响应:401 Unable to verify authorization token
.
我也在尝试从 jwt
创建 JSON Web 令牌
但同样的错误。任何帮助,将不胜感激。
提前致谢
我尝试了多种方法来解决这个问题。但是对我有用的是,在这里逐步描述如何使用 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 - 在键下,select 全部,然后单击右上角的添加按钮 (+)。
3- 在密钥描述下,为签名密钥输入一个唯一的名称。
4- 在关键服务下,select APNs 复选框,然后单击继续。
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
要获取设备的两位状态,我们将使用 Alamofire to https://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)")
}
}
}
我正在使用 Xcode10
、Swift 5
和 SwiftJWT
生成 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 的服务器收到此响应:401 Unable to verify authorization token
.
我也在尝试从 jwt
创建 JSON Web 令牌但同样的错误。任何帮助,将不胜感激。 提前致谢
我尝试了多种方法来解决这个问题。但是对我有用的是,在这里逐步描述如何使用 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 - 在键下,select 全部,然后单击右上角的添加按钮 (+)。
3- 在密钥描述下,为签名密钥输入一个唯一的名称。
4- 在关键服务下,select APNs 复选框,然后单击继续。
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
要获取设备的两位状态,我们将使用 Alamofire to https://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)")
}
}
}