# Sign-In with Ethereum
This package provides a Python implementation of EIP-4361: Sign In With Ethereum.
## Installation
SIWE can be easily installed in any Python project with pip:
```bash
pip install siwe
```
## Usage
SIWE provides a `SiweMessage` class which implements EIP-4361.
### Parsing a SIWE Message
Parsing is done by initializing a `SiweMessage` object with an EIP-4361 formatted string:
```python
from siwe import SiweMessage
message = SiweMessage.from_message(message=eip_4361_string)
```
Or to initialize a `SiweMessage` as a `pydantic.BaseModel` right away:
```python
message = SiweMessage(domain="login.xyz", address="0x1234...", ...)
```
### Verifying and Authenticating a SIWE Message
Verification and authentication is performed via EIP-191, using the `address` field of the `SiweMessage` as the expected signer. The validate method checks message structural integrity, signature address validity, and time-based validity attributes.
```python
try:
message.verify(signature="0x...")
# You can also specify other checks (e.g. the nonce or domain expected).
except siwe.ValidationError:
# Invalid
```
### Serialization of a SIWE Message
`SiweMessage` instances can also be serialized as their EIP-4361 string representations via the `prepare_message` method:
```python
print(message.prepare_message())
```
## Example
Parsing and verifying a `SiweMessage` is easy:
```python
try:
message: SiweMessage = SiweMessage(message=eip_4361_string)
message.verify(signature, nonce="abcdef", domain="example.com"):
except siwe.ValueError:
# Invalid message
print("Authentication attempt rejected.")
except siwe.ExpiredMessage:
print("Authentication attempt rejected.")
except siwe.DomainMismatch:
print("Authentication attempt rejected.")
except siwe.NonceMismatch:
print("Authentication attempt rejected.")
except siwe.MalformedSession as e:
# e.missing_fields contains the missing information needed for validation
print("Authentication attempt rejected.")
except siwe.InvalidSignature:
print("Authentication attempt rejected.")
# Message has been verified. Authentication complete. Continue with authorization/other.
```
## Testing
```bash
poetry install
git submodule update --init
poetry run pytest
```
## See Also
- [Sign-In with Ethereum: TypeScript](https://github.com/spruceid/siwe)
- [Example SIWE application: login.xyz](https://login.xyz)
- [EIP-4361 Specification Draft](https://eips.ethereum.org/EIPS/eip-4361)
- [EIP-191 Specification](https://eips.ethereum.org/EIPS/eip-191)
## Disclaimer
Our Python library for Sign-In with Ethereum has not yet undergone a formal
security audit. We welcome continued feedback on the usability, architecture,
and security of this implementation.
Raw data
{
"_id": null,
"home_page": "https://login.xyz",
"name": "siwe",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.8",
"maintainer_email": null,
"keywords": "SIWE, EIP-4361, Sign-In with Ethereum, Spruce ID",
"author": "Spruce Systems, Inc.",
"author_email": "hello@spruceid.com",
"download_url": "https://files.pythonhosted.org/packages/a0/20/53cce95942c4e7cac9020d509b88a9cf09b40443b7de8b6f44fe6e24aa26/siwe-4.4.0.tar.gz",
"platform": null,
"description": "# Sign-In with Ethereum\n\nThis package provides a Python implementation of EIP-4361: Sign In With Ethereum.\n\n## Installation\n\nSIWE can be easily installed in any Python project with pip:\n\n```bash\npip install siwe\n```\n\n## Usage\n\nSIWE provides a `SiweMessage` class which implements EIP-4361.\n\n### Parsing a SIWE Message\n\nParsing is done by initializing a `SiweMessage` object with an EIP-4361 formatted string:\n\n```python\nfrom siwe import SiweMessage\nmessage = SiweMessage.from_message(message=eip_4361_string)\n```\n\nOr to initialize a `SiweMessage` as a `pydantic.BaseModel` right away:\n\n```python\nmessage = SiweMessage(domain=\"login.xyz\", address=\"0x1234...\", ...)\n```\n\n### Verifying and Authenticating a SIWE Message\n\nVerification and authentication is performed via EIP-191, using the `address` field of the `SiweMessage` as the expected signer. The validate method checks message structural integrity, signature address validity, and time-based validity attributes.\n\n```python\ntry:\n message.verify(signature=\"0x...\")\n # You can also specify other checks (e.g. the nonce or domain expected).\nexcept siwe.ValidationError:\n # Invalid\n```\n\n### Serialization of a SIWE Message\n\n`SiweMessage` instances can also be serialized as their EIP-4361 string representations via the `prepare_message` method:\n\n```python\nprint(message.prepare_message())\n```\n\n## Example\n\nParsing and verifying a `SiweMessage` is easy:\n\n```python\ntry:\n message: SiweMessage = SiweMessage(message=eip_4361_string)\n message.verify(signature, nonce=\"abcdef\", domain=\"example.com\"):\nexcept siwe.ValueError:\n # Invalid message\n print(\"Authentication attempt rejected.\")\nexcept siwe.ExpiredMessage:\n print(\"Authentication attempt rejected.\")\nexcept siwe.DomainMismatch:\n print(\"Authentication attempt rejected.\")\nexcept siwe.NonceMismatch:\n print(\"Authentication attempt rejected.\")\nexcept siwe.MalformedSession as e:\n # e.missing_fields contains the missing information needed for validation\n print(\"Authentication attempt rejected.\")\nexcept siwe.InvalidSignature:\n print(\"Authentication attempt rejected.\")\n\n# Message has been verified. Authentication complete. Continue with authorization/other.\n```\n\n## Testing\n\n```bash\npoetry install\ngit submodule update --init\npoetry run pytest\n```\n\n## See Also\n\n- [Sign-In with Ethereum: TypeScript](https://github.com/spruceid/siwe)\n- [Example SIWE application: login.xyz](https://login.xyz)\n- [EIP-4361 Specification Draft](https://eips.ethereum.org/EIPS/eip-4361)\n- [EIP-191 Specification](https://eips.ethereum.org/EIPS/eip-191)\n\n## Disclaimer\n\nOur Python library for Sign-In with Ethereum has not yet undergone a formal\nsecurity audit. We welcome continued feedback on the usability, architecture,\nand security of this implementation.\n",
"bugtrack_url": null,
"license": "MIT OR Apache-2.0",
"summary": "A Python implementation of Sign-In with Ethereum (EIP-4361).",
"version": "4.4.0",
"project_urls": {
"Discord": "https://discord.gg/Sf9tSFzrnt",
"EIP": "https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4361.md",
"Homepage": "https://login.xyz",
"Repository": "https://github.com/spruceid/siwe-py"
},
"split_keywords": [
"siwe",
" eip-4361",
" sign-in with ethereum",
" spruce id"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "67713bc6d28fe362f295593f570e93db8ec84842634efc3f55612dfab51e7748",
"md5": "2f6a997f6a127cd71c8c5355662f4ac9",
"sha256": "3a4db2d36e10933c01d09ba0aad4db2f404e9ab2c9e9a204fa1bc1103e9d754d"
},
"downloads": -1,
"filename": "siwe-4.4.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "2f6a997f6a127cd71c8c5355662f4ac9",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.8",
"size": 10472,
"upload_time": "2024-10-11T15:29:12",
"upload_time_iso_8601": "2024-10-11T15:29:12.860842Z",
"url": "https://files.pythonhosted.org/packages/67/71/3bc6d28fe362f295593f570e93db8ec84842634efc3f55612dfab51e7748/siwe-4.4.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a02053cce95942c4e7cac9020d509b88a9cf09b40443b7de8b6f44fe6e24aa26",
"md5": "22cb68e5894e017e050fba919389652d",
"sha256": "5fdf843253a91d78085f1da11ed7c9695bbb743e112da658e63a285ddf3ffec7"
},
"downloads": -1,
"filename": "siwe-4.4.0.tar.gz",
"has_sig": false,
"md5_digest": "22cb68e5894e017e050fba919389652d",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.8",
"size": 14258,
"upload_time": "2024-10-11T15:29:14",
"upload_time_iso_8601": "2024-10-11T15:29:14.284096Z",
"url": "https://files.pythonhosted.org/packages/a0/20/53cce95942c4e7cac9020d509b88a9cf09b40443b7de8b6f44fe6e24aa26/siwe-4.4.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-10-11 15:29:14",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "ethereum",
"github_project": "EIPs",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "siwe"
}