diff --git a/.flake8 b/.flake8
new file mode 100644
index 00000000..792698c8
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,5 @@
+[flake8]
+exclude =
+    tests/*
+max-line-length = 100
+max-complexity = 10
diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml
new file mode 100644
index 00000000..5fc455c4
--- /dev/null
+++ b/.github/workflows/pypi.yml
@@ -0,0 +1,55 @@
+name: Release to PyPI
+
+permissions:
+  contents: write
+
+on:
+  push:
+    tags:
+      - "1.*"
+
+jobs:
+  build:
+    name: build dist files
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v3
+
+    - uses: actions/setup-python@v4
+      with:
+        python-version: 3.9
+
+    - name: install build
+      run: python -m pip install --upgrade build
+
+    - name: build dist
+      run: python -m build
+
+    - uses: actions/upload-artifact@v3
+      with:
+        name: artifacts
+        path: dist/*
+        if-no-files-found: error
+
+  publish:
+    environment:
+      name: pypi-release
+      url: https://pypi.org/project/Authlib/
+    permissions:
+      id-token: write
+    name: release to pypi
+    needs: build
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/download-artifact@v3
+      with:
+        name: artifacts
+        path: dist
+
+    - name: Push build artifacts to PyPI
+      uses: pypa/gh-action-pypi-publish@release/v1
+      with:
+        skip-existing: true
+        password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/docs/changelog.rst b/docs/changelog.rst
index a6765ac3..ba3ca923 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -6,6 +6,21 @@ Changelog
 
 Here you can see the full list of changes between each Authlib release.
 
+Version 1.3.0
+-------------
+
+- Restore ``AuthorizationServer.create_authorization_response`` behavior, via :PR:`558`
+- Include ``leeway`` in ``validate_iat()`` for JWT, via :PR:`565`
+- Fix ``encode_client_secret_basic``, via :PR:`594`
+- Use single key in JWK if JWS does not specify ``kid``, via :PR:`596`
+- Fix error when RFC9068 JWS has no scope field, via :PR:`598`
+
+**New features**:
+
+- RFC9068 implementation, via :PR:`586`, by @azmeuk.
+
+**Breaking changes**:
+
 - End support for python 3.7
 
 Version 1.2.1
@@ -106,127 +121,21 @@ Added ``ES256K`` algorithm for JWS and JWT.
 **Breaking Changes**: find how to solve the deprecate issues via https://git.io/JkY4f
 
 
-Version 0.15.5
---------------
-
-**Released on Oct 18, 2021.**
-
-- Make Authlib compatible with latest httpx
-- Make Authlib compatible with latest werkzeug
-- Allow customize RFC7523 ``alg`` value
-
-Version 0.15.4
---------------
-
-**Released on Jul 17, 2021.**
-
-- Security fix when JWT claims is None.
-
-
-Version 0.15.3
---------------
-
-**Released on Jan 15, 2021.**
-
-- Fixed `.authorize_access_token` for OAuth 1.0 services, via :issue:`308`.
-
-Version 0.15.2
---------------
-
-**Released on Oct 18, 2020.**
-
-- Fixed HTTPX authentication bug, via :issue:`283`.
-
-
-Version 0.15.1
---------------
-
-**Released on Oct 14, 2020.**
-
-- Backward compatible fix for using JWKs in JWT, via :issue:`280`.
-
-
-Version 0.15
-------------
-
-**Released on Oct 10, 2020.**
-
-This is the last release before v1.0. In this release, we added more RFCs
-implementations and did some refactors for JOSE:
-
-- RFC8037: CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)
-- RFC7638: JSON Web Key (JWK) Thumbprint
-
-We also fixed bugs for integrations:
-
-- Fixed support for HTTPX>=0.14.3
-- Added OAuth clients of HTTPX back via :PR:`270`
-- Fixed parallel token refreshes for HTTPX async OAuth 2 client
-- Raise OAuthError when callback contains errors via :issue:`275`
-
-**Breaking Change**:
-
-1. The parameter ``algorithms`` in ``JsonWebSignature`` and ``JsonWebEncryption``
-are changed. Usually you don't have to care about it since you won't use it directly.
-2. Whole JSON Web Key is refactored, please check :ref:`jwk_guide`.
-
-Version 0.14.3
---------------
-
-**Released on May 18, 2020.**
-
-- Fix HTTPX integration via :PR:`232` and :PR:`233`.
-- Add "bearer" as default token type for OAuth 2 Client.
-- JWS and JWE don't validate private headers by default.
-- Remove ``none`` auth method for authorization code by default.
-- Allow usage of user provided ``code_verifier`` via :issue:`216`.
-- Add ``introspect_token`` method on OAuth 2 Client via :issue:`224`.
-
-
-Version 0.14.2
---------------
-
-**Released on May 6, 2020.**
-
-- Fix OAuth 1.0 client for starlette.
-- Allow leeway option in client parse ID token via :PR:`228`.
-- Fix OAuthToken when ``expires_at`` or ``expires_in`` is 0 via :PR:`227`.
-- Fix auto refresh token logic.
-- Load server metadata before request.
-
-
-Version 0.14.1
---------------
-
-**Released on Feb 12, 2020.**
-
-- Quick fix for legacy imports of Flask and Django clients
-
-
-Version 0.14
-------------
-
-**Released on Feb 11, 2020.**
-
-In this release, Authlib has introduced a new way to write framework integrations
-for clients.
-
-**Bug fixes** and enhancements in this release:
-
-- Fix HTTPX integrations due to HTTPX breaking changes
-- Fix ES algorithms for JWS
-- Allow user given ``nonce`` via :issue:`180`.
-- Fix OAuth errors ``get_headers`` leak.
-- Fix ``code_verifier`` via :issue:`165`.
-
-**Breaking Change**: drop sync OAuth clients of HTTPX.
-
-
 Old Versions
 ------------
 
 Find old changelog at https://github.com/lepture/authlib/releases
 
+- Version 0.15.5: Released on Oct 18, 2021
+- Version 0.15.4: Released on Jul 17, 2021
+- Version 0.15.3: Released on Jan 15, 2021
+- Version 0.15.2: Released on Oct 18, 2020
+- Version 0.15.1: Released on Oct 14, 2020
+- Version 0.15.0: Released on Oct 10, 2020
+- Version 0.14.3: Released on May 18, 2020
+- Version 0.14.2: Released on May 6, 2020
+- Version 0.14.1: Released on Feb 12, 2020
+- Version 0.14.0: Released on Feb 11, 2020
 - Version 0.13.0: Released on Nov 11, 2019
 - Version 0.12.0: Released on Sep 3, 2019
 - Version 0.11.0: Released on Apr 6, 2019
diff --git a/pyproject.toml b/pyproject.toml
index 9787c3bd..47061ee9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,49 @@
+[project]
+name = "Authlib"
+description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
+authors = [{name = "Hsiaoming Yang", email="me@lepture.com"}]
+dependencies = [
+  "cryptography",
+]
+license = {text = "BSD-3-Clause"}
+requires-python = ">=3.8"
+dynamic = ["version"]
+readme = "README.rst"
+classifiers = [
+  "Development Status :: 5 - Production/Stable",
+  "Environment :: Console",
+  "Environment :: Web Environment",
+  "Intended Audience :: Developers",
+  "License :: OSI Approved :: BSD License",
+  "Operating System :: OS Independent",
+  "Programming Language :: Python",
+  "Programming Language :: Python :: 3",
+  "Programming Language :: Python :: 3.8",
+  "Programming Language :: Python :: 3.9",
+  "Programming Language :: Python :: 3.10",
+  "Programming Language :: Python :: 3.11",
+  "Programming Language :: Python :: Implementation :: CPython",
+  "Topic :: Security",
+  "Topic :: Security :: Cryptography",
+  "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
+  "Topic :: Internet :: WWW/HTTP :: WSGI :: Application",
+]
+
+[project.urls]
+Documentation = "https://docs.authlib.org/"
+Purchase = "https://authlib.org/plans"
+Issues = "https://github.com/lepture/authlib/issues"
+Source = "https://github.com/lepture/authlib"
+Donate = "https://github.com/sponsors/lepture"
+Blog = "https://blog.authlib.org/"
+
 [build-system]
 requires = ["setuptools", "wheel"]
 build-backend = "setuptools.build_meta"
+
+[tool.setuptools.dynamic]
+version = {attr = "authlib.__version__"}
+
+[tool.setuptools.packages.find]
+where = ["."]
+include = ["authlib", "authlib.*"]
diff --git a/setup.cfg b/setup.cfg
index 15d2bf78..b636ad0c 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,67 +1,10 @@
 [bdist_wheel]
 universal = 1
 
-[metadata]
-name = Authlib
-version = attr: authlib.__version__
-author = Hsiaoming Yang
-url = https://authlib.org/
-author_email = me@lepture.com
-license = BSD 3-Clause License
-license_file = LICENSE
-description = The ultimate Python library in building OAuth and OpenID Connect servers and clients.
-long_description = file: README.rst
-long_description_content_type = text/x-rst
-platforms = any
-classifiers =
-    Development Status :: 5 - Production/Stable
-    Environment :: Console
-    Environment :: Web Environment
-    Framework :: Flask
-    Framework :: Django
-    Intended Audience :: Developers
-    License :: OSI Approved :: BSD License
-    Operating System :: OS Independent
-    Programming Language :: Python
-    Programming Language :: Python :: 3
-    Programming Language :: Python :: 3.8
-    Programming Language :: Python :: 3.9
-    Programming Language :: Python :: 3.10
-    Programming Language :: Python :: 3.11
-    Programming Language :: Python :: 3.12
-    Topic :: Internet :: WWW/HTTP :: Dynamic Content
-    Topic :: Internet :: WWW/HTTP :: WSGI :: Application
-
-project_urls =
-    Documentation = https://docs.authlib.org/
-    Commercial License = https://authlib.org/plans
-    Bug Tracker = https://github.com/lepture/authlib/issues
-    Source Code = https://github.com/lepture/authlib
-    Donate = https://github.com/sponsors/lepture
-    Blog = https://blog.authlib.org/
-
-[options]
-packages = find:
-zip_safe = False
-include_package_data = True
-install_requires =
-    cryptography>=3.2
-
-[options.packages.find]
-include=
-    authlib
-    authlib.*
-
 [check-manifest]
 ignore =
     tox.ini
 
-[flake8]
-exclude =
-    tests/*
-max-line-length = 100
-max-complexity = 10
-
 [tool:pytest]
 python_files = test*.py
 norecursedirs = authlib build dist docs htmlcov