一个用于将Shopify身份验证添加到Django应用的简单包。
项目描述
Django Shopify Auth
这个Django包使得将Shopify身份验证集成到Django应用中变得简单。
-
它提供了一个基于
AbstractBaseUser
和RemoteUserBackend
的自定义Django认证方案,这意味着商店将作为您的Django应用的“用户”进行认证。这使得使用常见的Django模式和库(如通过request.user
访问当前认证的商店)变得更加容易。 -
它将用户的Shopify访问令牌持久化存储在数据库中,而不是会话中,这意味着您的应用能够在用户未登录时代表用户进行API调用。
-
它支持嵌入式Shopify应用的基于令牌的认证流程。
嵌入式与独立应用
嵌入式应用现在需要基于会话令牌的认证。支持已在单独应用中实现。如果您不确定使用哪种方法,请阅读这篇文章。
要求
测试是在定义在.github/workflows/ci.yml
中的Django版本上运行的。这个包可能适用于其他Django版本,但无法保证。
您需要一个Shopify合作伙伴账户并创建一个应用,以便获取API密钥和密钥。
包安装和设置 - 独立应用
设置有几个部分,但希望以下说明会使事情变得简单。
在本配置中,我们假设您正在使用标准的Django项目布局(使用django-admin.py startproject
命令创建的那种)。我们还假设我们的项目名为auth_demo
,并且我们项目中的主要Django应用将被命名为auth_app
。
1. 安装包
通过pip
安装非常简单
> pip install django-shopify-auth
安装完包后,将shopify_auth
添加到您的INSTALLED_APPS
中。
2. 添加自定义用户模型
因为shopify_auth
使用了Django的认证系统,它提供了一个自定义认证后端(shopify_auth.backends.ShopUserBackend
),允许通过Shopify的OAuth流程进行认证。
此后端要求您的应用的用户模型(由您的settings.py
中的AUTH_USER_MODEL
指定)继承自shopify_auth.models.AbstractShopUser
。为此,只需将类似以下内容添加到您的Django应用的models.py
文件中
# auth_demo/auth_app/models.py
from shopify_auth.models import AbstractShopUser
class AuthAppShopUser(AbstractShopUser):
pass
在继续之前,请确保已通过以下操作将此模型添加到数据库中
python manage.py makemigrations
python manage.py migrate
然后请确保在settings.py
中包含以下行或类似内容
AUTH_USER_MODEL = 'auth_app.AuthAppShopUser'
3. 配置设置
除了设置AUTH_USER_MODEL
之外,还需要在settings.py
中添加一些其他要求
# Configure Shopify Application settings
SHOPIFY_APP_NAME = 'Your App Name'
SHOPIFY_APP_API_KEY = os.environ.get('SHOPIFY_APP_API_KEY')
SHOPIFY_APP_API_SECRET = os.environ.get('SHOPIFY_APP_API_SECRET')
SHOPIFY_APP_API_SCOPE = ['read_products', 'read_orders']
# Find API version to pin at https://help.shopify.com/en/api/versioning
SHOPIFY_APP_API_VERSION = "0000-00"
SHOPIFY_APP_DEV_MODE = False
# Use the Shopify Auth authentication backend as the sole authentication backend.
AUTHENTICATION_BACKENDS = (
'shopify_auth.backends.ShopUserBackend',
)
# Add the Shopify Auth template context processor to the list of processors.
# Note that this assumes you've defined TEMPLATE_CONTEXT_PROCESSORS earlier in your settings.
TEMPLATE_CONTEXT_PROCESSORS += (
'shopify_auth.context_processors.shopify_auth',
)
# Use the Shopify Auth user model.
AUTH_USER_MODEL = 'auth_app.AuthAppShopUser'
# Set the login redirect URL to the "home" page for your app (where to go after logging on).
LOGIN_REDIRECT_URL = '/'
# Set secure proxy header to allow proper detection of secure URLs behind a proxy.
# This ensures that correct 'https' URLs are generated when our Django app is running behind a proxy like nginx, or is
# being tunneled (by ngrok, for example).
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
注意,在上面的示例中,应用程序API密钥和API密钥是从环境设置中提取的,这是Django应用程序的最佳实践,有助于避免敏感信息意外检查到源文件中。
将SHOPIFY_APP_DEV_MODE
设置为True
允许您通过跳过应用程序的外部OAuth阶段在本地测试您的应用程序。因为它意味着您可以用任何商店登录到您的应用程序,所以显然您永远不应该在生产中将此设置为True
。
现在所有设置都配置好了,您可以通过运行migrate
来为新用户模型设置数据库
> python manage.py migrate
4. 配置URL映射
将shopify_auth
URL包含在您的项目的urls.py
中
# urls.py
from django.urls import include, path
urlpatterns = [
path('login/', include('shopify_auth.urls')),
# ... remaining configuration here ...
]
5. 创建应用程序视图
现在配置已经完成,您可以从构建您的应用程序开始。
您应用程序中的所有视图都应该使用@login_required
进行装饰。此装饰器将检查用户是否已通过Shopify OAuth流程进行认证。如果没有,他们将重定向到登录屏幕。
from django.shortcuts import render
from shopify_auth.decorators import login_required
@login_required
def home(request, *args, **kwargs):
return render(request, "my_app/home.html")
6. 调用Shopify API
要代表用户调用Shopify API,我们可以在with
语句中使用用户的session
属性
def view(request, *args, **kwargs):
# Get a list of the user's products.
with request.user.session:
products = shopify.Product.find()
# ... remaining view code ...
在幕后,使用with request.user.session
设置了一个临时Shopify API会话,使用我们在认证期间为该特定用户获得的OAuth令牌。
在with
语句内包装的所有代码都是在指定的用户上下文中执行的。您应该始终使用此模式来包装对Shopify API的调用。
合作伙伴应用程序设置
除了在您的本地Django项目中安装并运行包之外,您还需要通过Shopify合作伙伴仪表板配置您的应用程序。
为了避免在客户尝试安装您的应用程序时遇到OAuth错误,请确保您的应用程序设置中包含了到/login/finalize/
(包括尾随斜杠)的绝对URL(在白名单URL中)。例如,如果您的应用程序位于https://myapp.example.com
,则应在应用程序设置的“重定向URL”部分中包含https://myapp.example.com/login/finalize/
。
有疑问或问题吗?
阅读有关可能的API调用的信息:https://shopify.dev/
在Stack Overflow上提出技术问题:https://stackoverflow.com/questions/tagged/shopify
发行历史
有关更改的完整列表,请参阅变更日志。
特别感谢
向Josef Rousek致以崇高的敬意,感谢他的贡献和帮助维护此包。
与我们合作!
如果您想使用Django,甚至可能使用React,当前维护者Digismoothie.com正在招聘。