Sign in with Apple
Project description
Sign in with Apple
A library facilitating the server-side validation of Sign in with Apple (SIWA) identity tokens.
This library has a very narrow focus. It addresses a small subset of the potential ways in which SIWA can be used. It does not attempt to address the web-based SIWA flow. It abstracts away RSA256, JSON Web Tokens, and other machinery used by SIWA, and attempts to provide a simple, clean interface for application development.
The problem this library solves
Suppose you have a macOS or iOS application. You present the SIWA interface
(the "Sign in with Apple" button) to a user using
AuthenticationServices
.
They sign in. Your app is provided with an instance of
ASAuthorizationAppleIDCredential
(the "client side credential"), containing data describing the user.
Suppose your system is controlled by a platform agnostic application programming interface (API). You wish to create a new user account, or sign in an existing user, via your API. Your app makes an HTTP request to your API asking it to create a new user or sign in an existing user based on the data contained the client side credential.
How do you know the data was provided by AuthenticationServices
, and not
just smashed together in a text editor? That is, how do you know the
data are authentic on the server side?
Apple facilitates the authentication of the credential by providing a blob
of data in the ASAuthorizationAppleIDCredential.identityToken
property. This
identity token contains a JSON Web Token ("JWT"), a standardised format for
carrying credentials.
Validation of the credential may be achieved via asymmetric cryptography, using the RSA256 algorithm. Apple retains a secret encryption key, and publishes a related public key. Apple creates signature (a large string of text) using two inputs: Their private key, and the contents of the client side credential.
External parties like your API can verify the authenticity of that signature, and therefore the associated credential, using the public key published by Apple.
This library performs the following functions with respect to the above process:
- Retrieves Apple's public key
- Parses an identity token (
ASAuthorizationAppleIDCredential.identityToken
) - Provides a boolean flag asserting that the credential is valid or not valid
- Provides convenient access to the content of the identity token (e.g the user email address)
Installation
Install Sign in with Apple via PyPi:
pip install siwa
Dependencies
This library is heavily dependent on
PyJWT
. All validation of identity
tokens is peformed by PyJWT
.
Marshalling of the Apple public RSA key into PKS12 format is performed by
the PythonRSA
library.
Usage
from siwa import IdentityToken, KeyCache
cache = KeyCache() # The cache is optional but will reduce the time taken
# to validate tokens using the same public key
token = IdentityToken.parse(data=json_string)
token_is_valid = token.is_validly_signed(key_cache=cache)
# if `token_is_valid` is True, you can confidently proceed with the credential
# Useful properties:
print(token.payload.email)
print(token.payload.unique_apple_user_id)
print(token.issued_utc_seconds_since_epoch)
Testing
To test the library, create a file that contains a valid SIWA identity token.
For example, one that you have obtained from AuthenticationServices
in
Xcode.
Run test.py
, passing the relative path to that file under the
--example-jwt-file
parameter:
python3 test.py --example-jwt-file example/jwt/file
Contact
@hugh_jeremy on Twitter or email hugh@blinkybeach.com
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file siwa-0.0.3.tar.gz
.
File metadata
- Download URL: siwa-0.0.3.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.2.0 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | dd54791a9b42bc4d6e2caa8e9ee2b8390f5abc961354c2de20e48657192c3a2c |
|
MD5 | 797bf5b2eb6cf3d262b04186264f1207 |
|
BLAKE2b-256 | 8aad158b613e573519956f4cddfbc0bf19decce735280d64975f67465dfd8163 |
File details
Details for the file siwa-0.0.3-py3-none-any.whl
.
File metadata
- Download URL: siwa-0.0.3-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.2.0 pkginfo/1.6.1 requests/2.24.0 setuptools/50.2.0 requests-toolbelt/0.9.1 tqdm/4.51.0 CPython/3.8.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1084b17ea9cc22c61c81384625b44bcbc0e77bedd5459adb3987a4b816dd066a |
|
MD5 | 29629a55c1f5a448abb77f799a5f2253 |
|
BLAKE2b-256 | 47c834f29297959910f16c632a74b2fee1eb36ec1689f333dd4d1ffd9e403900 |