DeviceCheck

RSS for tag

Access per-device, per-developer data that your associated server can use in its business logic using DeviceCheck.

DeviceCheck Documentation

Posts under DeviceCheck tag

27 Posts
Sort by:
Post not yet marked as solved
0 Replies
97 Views
I have a problem is we have some clients. And each client have difference Apple Development Id. But we want to share data between apps like Keychain Sharing or App Group but it require same Apple Development Id. So have any other ways for apps can share data with difference Apple Id?
Posted
by VuDN.
Last updated
.
Post not yet marked as solved
1 Replies
662 Views
I am submitting the JWT with required payload to https://api.development.devicecheck.apple.com/v1/validate_device_token. However Apple's development devicecheck server always returns http response 401 - Unable to verify authorization token.  I generated the token following the instructions in https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests and check token by curl -v -H 'Authorization: Bearer [signed token]' "https://api.appstoreconnect.apple.com/v1/apps" I can use that token to call this API successfully. However, when I tried to use exactly the same token to verify a device ID, I got a 401 response here is my payload for the request https://api.devicecheck.apple.com/v1/validate_device_token It's my code: now = int(time.time()) expire_time = now + 20 * 60 HEADERS = { 		"alg": "ES256", 		"kid": kid, 		"typ": "JWT" } PAYLOAD = { 		'exp': expire_time, 		'iss': iss, 		'aud': "appstoreconnect-v1" } jwt_token = jwt.encode(PAYLOAD, private_key, algorithm='ES256', headers=HEADERS).decode('utf-8') auth = 'Bearer {}'.format(jwt_token) headers = { 		'Content-Type': 'application/x-www-form-urlencoded', 		'Authorization': auth } response = requests.get( 		'https://api.appstoreconnect.apple.com/v1/apps', 		headers=headers ) print(response.status_code) print(response.text) request_file = '.../ValidateDeviceTokenRequest.json' data = None with open(request_file) as json_file: 		data = json.load(json_file) data['timestamp'] = (now) * 1000 response = requests.post( 		'https://api.devicecheck.apple.com/v1/validate_device_token', 		data=json.dumps(data).encode(), 		headers=headers ) print(response.status_code) print(response.text)
Posted
by hungngph.
Last updated
.
Post not yet marked as solved
2 Replies
993 Views
I’m trying to get DeviceCheck to work, where I keep getting this response from Apple’s server: 401 ‘Unable to verify authorization token’.The device_token is being sent to my Python server over a base64 encoded string in another similar JSON payload. I’ve even tried cutting and pasting the base64 string from the logs directly to my server (very quickly) and nothing works. Any ideas what I might be doing wrong?I’m slightly concerned perplexed that in the https://developer.apple.com/account/ios/authkey/, the generated key is not explicitly associated with my app other than being generated in my apple account.def device_check_query(device_token): data = { ‘device_token’: device_token.replace(“\\“, “”), ‘transaction_id’: str(uuid4()), ‘timestamp’: int(time.time() * 1000), } jw_token = get_jw_token() headers = {‘Authorization’: ‘Bearer ’ + jw_token} response = requests.post(QUERY_URL, json=data, headers=headers) return response.content def get_jw_token(): with open(KEY_FILE, ‘r’) as cert_file: certificate = cert_file.read() jw_token = jwt.encode( {‘iss’: TEAM_ID}, certificate, algorithm=‘ES256’, headers={‘kid’: KEY_ID}) return jw_token
Posted
by andrewmc.
Last updated
.
Post not yet marked as solved
0 Replies
113 Views
Hi everybody, I am trying to make DeviceCheck work in Javascript. But I keep on getting this issue: Unable to verify authorization token Following is my code: versionRouter.post('/update_two_bits', function(req, response) { console.log('hereeee'); console.log("\n\n\n\n\n"); var dctoken = req.body.token; var bit0 = req.body.bit0; var bit1 = req.body.bit1; console.log("Updating two bits to:"); console.log("bit0: "+bit0); console.log("bit1: "+bit1); var jwToken = jwt.sign({}, cert, { algorithm: 'ES256', keyid: keyId, issuer: teamId,}); console.log('jwToken',jwToken); // Build the post string from an object var post_data = { 'device_token' : dctoken, 'transaction_id': uuidv4(), 'timestamp': Date.now(), 'bit0': bit0, 'bit1': bit1 } // An object of options to indicate where to post to var post_options = { host: deviceCheckHost, port: '443', path: '/v1/update_two_bits', method: 'POST', headers: { 'Authorization': 'Bearer '+jwToken } }; // Set up the request var post_req = https.request(post_options, function(res) { res.setEncoding('utf8'); console.log(res.headers); console.log("statusCode: "+res.statusCode); var data = ""; res.on('data', function (chunk) { data += chunk; }); res.on('end', function() { console.log(data); response.send({"status": res.statusCode}); }); res.on('error', function(data) { console.log('error'); console.log(data); response.send({"status": res.statusCode}); }); }); // post the data post_req.write(new Buffer.from(JSON.stringify(post_data))); post_req.end(); }); Kindly provide some solution for it.
Posted Last updated
.
Post not yet marked as solved
1 Replies
448 Views
I have built a server app to generate a JWT using apple KEYID, TEAMID and P8 private key file. I am submitting the JWT with required payload to https://api.development.devicecheck.apple.com/v1/query_two_bits. However Apple's development devicecheck server always returns http response 401 - Unable to verify authorization token. Is there some other request I can send to Apple's development devicecheck server that could give me more detail why error 401 was being returned?
Posted
by iantolas.
Last updated
.
Post not yet marked as solved
0 Replies
122 Views
I just placed a test where I've tested my site on different platforms. It's doing well on Andriod devices but not showing responsiveness on ios devices. What are the possible reasons for this???
Posted
by subflow.
Last updated
.
Post not yet marked as solved
1 Replies
165 Views
Hi! We have enabled automatic renewal for apple developer account of our company. Today is our renewal date and it was renewed already. But the device reset popup doesn't show up yet. Can anyone help me with this? We have already exceeded our registered device limit and we have to wait another year for device resetting otherwise. Thanks!
Posted Last updated
.
Post marked as solved
2 Replies
328 Views
Hello, I've already made a previous similar post but it's getting a bit old so I'm re-launching it. I am currently developing an iOS application using AppCheck with AppAttest. I have read Apple's documentation on AppAttest to understand how it works. However, there is a part I didn't understand. When the public key is to be shared, Apple will create a certificate to attest that this public key belongs to an official instance of my application. Here is what it says about this verification on the official website : How does the Apple server identify that the key comes from an official instance of my application ? I can also rephrase my question as follows: How does the apple server detect an unofficial instance of my application if the data it receives for this check comes from it directly (I assume and I am probably wrong) and can therefore be falsified ? Is this a secret process to which I cannot have access, this answer would also suit me ? Thanks for your attention !
Posted
by Sheezen.
Last updated
.
Post not yet marked as solved
1 Replies
785 Views
We see appAttest (available iOS 14+) provides us 3 key features: if app instance is not modified, device is genuine apple device and payload is not tempered with. We also have deviceCheck Api (iOS 11+) which return 2 bits per device, as mentioned in documentation we can create different payloads for validation and different for updating the 2 bits. Apart from returning those bits in validation request, does this DeviceCheck APIs also validate 2 of the 3 above features i.e. app is not modified and the device is genuine apple device? If yes, what response from apple server to look for in successful validation of above 2 features and what response to look for in fraud cases or failure cases? Does isSupported in case of DCDevice.current hints the device is a simulator ? Can we get exhaustive list of cases where isSupported is false? Does DCDevice.current.generateToken fails only in case of modified app instance? Can we get exhaustive list of cases where above can throw error? Can modified app instance also able to generateToken?
Posted Last updated
.
Post not yet marked as solved
1 Replies
216 Views
Is there a recommended way to determine whether to use the development or the production server API endpoint for DeviceCheck? For App Attest, the authenticator data includes either "appattest" or "appattestdevelop" in a field of the cbor data. For IAPs, we're supposed to try the production endpoint and then retry with the development endpoint if we get a particular HTTP status code. But the docs for DeviceCheck say only to use the development endpoint in development and the production endpoint in production. What are others doing? Is there any clue in the docs that I have missed?
Posted
by endecotp.
Last updated
.
Post not yet marked as solved
1 Replies
260 Views
According to documentation, the guideline is as follows - "Don’t reuse a key among multiple users on a device because this weakens security protections. In particular, it becomes hard to detect an attack that uses a single compromised device to serve multiple remote users running a compromised version of your app." This can be addressed if we keep a tally of how many users have used the same key pair? If we see a single key pair in use across say 500 users, it's clearly an instance of compromised device. Are there other security reasons why binding a key to device + user is the recommended practice?
Posted Last updated
.
Post not yet marked as solved
9 Replies
2.1k Views
Hello, I have problem with DeviceCheck framework on iOS 14. On some devices with version, 14.x attestation doesn't work properly. In response, I get 400 error code and Missing or incorrectly formatted device token payload. This is very weird because this reproduces on a small group of devices and device after hard reset works fine.
Posted Last updated
.
Post not yet marked as solved
0 Replies
224 Views
Apple team, I need your help. Can you answer for my question in thread: https://developer.apple.com/forums/thread/701876 ? I created new thread due to I wasn't able to add tag wwdc21-10244 in thread 701876.
Posted
by Fman.
Last updated
.
Post not yet marked as solved
0 Replies
361 Views
Hi, I'm trying to validate device token generated on app which is signed by Enterprise account. I generate deviceToken on device I send the token to our backend Our backend creates JWT token The backend calls validate_device_token endpoint and receives 401 The authentication token can't be verified I've seen many implementations on the internet and I'm pretty sure that we generate the token in correct way. (eg implementation: https://github.com/marinosoftware/DeviceCheckSample) The Questions are: Is it possible to use DeviceCheck on Enterprise Account ? There is no possibility to enable DeviceCheck on Enterprise account is APNs key configuration: https://developer.apple.com/account/resources/authkeys/list. Is this configuration required ? Is there is a way to validate signature of JWT token locally ? Services such as https://jwt.io requires Public and Private keys in correct format, I didn't find a way to validate the signature signed by p8 certificate without any additional keys.
Posted
by Fman.
Last updated
.
Post not yet marked as solved
1 Replies
323 Views
Hi! Sometimes when calling DCAppAttestService.shared.generateAssertion(key.id, clientDataHash: hash) I'm getting DCError.Code.invalidInput. I am formatting clientDataHash usingSHA256.hash - so it is always 32 bytes long. As I found out - this error depends on hash that I pass to generateAssertion method. But I could not find any system - which hashes are good and which are not. Keys are always correct, otherwise invalidKey error would be risen. What can cause the issue? I'm testing on iPhone 11, iOS 15.2.1
Posted
by beetlab.
Last updated
.
Post not yet marked as solved
0 Replies
217 Views
Always get this error during device token validation. Are there any ideas why it's happening? Here is the snipped of the code below I use for JWT generation. import time import jwt private_key = """-----BEGIN PRIVATE KEY----- mykey -----END PRIVATE KEY-----""" data = { "iss": "my_team_id", "iat": int(time.time()), } headers = { "kid": "my_key_id", } jwt_token = jwt.encode( payload=data, key=private_key, algorithm="ES256", headers=headers ) print(jwt_token)
Posted Last updated
.
Post not yet marked as solved
1 Replies
744 Views
Hi, We have a multi-platform application that requires integrity attestation before the backend will enable supporting services (fairly common scenario). I've read the documentation for DeviceCheck and AppAttest, as well as SafetyNet on the Android side. The Android documentation includes lots of examples of use, including server-side (though oddly in C# and Javascript... which I don't see as being server-side languages, but... oh, well). Anyway, maybe there's a server-side example of using an application attestation on the server when validating a client, as well as validating individual requests with assertions, but I've not been able to find it. It seems like a relatively important bit of functionality to ensure that apps aren't being compromised, while at the same time requiring a correct implementation... Why not give a reference implementation as a starting point to make sure developers are on the right path? Can anyone point me at an example as a Gist, etc? Thanks.
Posted
by PhilipTP.
Last updated
.
Post not yet marked as solved
4 Replies
369 Views
I have a webserver developed from scratch in Microsoft visual c ++ 2019. I use only c/c++, when I receive the request, I process it and build a response that I send to the client. I use my iPhone (13 pro with iOS 15.2). Case 1: I am connected to a local wi-fi, I type the server address (local address or external address by port forwarding), it receives 'get / http ...' and 'get / other resources' through 3-4 simultaneous connections and responds with the content of the requested page. The connections remain stable and I can navigate further through the site, opening other pages without any problems. iPhone send requests and my server respond. everything works fine. Case 2: I am connected only to the telephone operator (4G Vodafone), I type the external server address, it receives 'get / http ...' and 'get / other resources' through 3-4 simultaneous connections and responds with the content of the requested page. (just once, only first page). After that, the connections disappear and I can no longer browse the site (because I lose the session ID and other credentials). **In fact, the iPhone, after receiving what it requested, sends many null buffers and my server disconnects all sockets immediately. is something to do with WSAENOBUF, but I don't know what.   ** Why this dual behavior. How can I solve this situation? Thank you very much.
Posted
by Catalin1.
Last updated
.
Post not yet marked as solved
0 Replies
300 Views
Hi! We are using Device Check tokens to prove that HTTP request comes from iOS device. We found out that both envs - prod and sandbox doesn't limit token lifetime v1/validate_device_token always return true and can be reused for a long period of time per one DCDevice token. v1/update_two_bits also can be reused unlimited number of times per one token (didn't measure the exact number) Is it true - that lifetime of token generated via DCDevice.generateToken isn't short (minutes) and we should build our own infrastructure to prevent replay attacks?
Posted
by beetlab.
Last updated
.