跳转到主要内容

通过Slack进行员工认证,POLITICO的方式。

项目描述

POLITICO

          __          _____  _____                 __  .__
  _______/  |______ _/ ____\/ ____\ _____   __ ___/  |_|  |__
 /  ___/\   __\__  \\   __\\   __\  \__  \ |  |  \   __\  |  \
 \___ \  |  |  / __ \|  |   |  |     / __ \|  |  /|  | |   Y  \
/____  > |__| (____  /__|   |__|    (____  /____/ |__| |___|  / /\
     \/            \/                    \/                 \/  \/

POLITICO员工认证

此应用程序存储了一些我们在POLITICO的各种Django应用程序中使用的实用工具,以集成我们的员工授权和认证,该认证通过Python Social Auth使用Slack实现。

要求

  • Python 3.6 — brew install python

  • Pipenv — brew install pipenv

  • Django(已在2.1.x和2.2.x版本上测试过)

  • 具有用户的Slack工作空间

  • 连接到该工作空间的Slack应用程序,其中“重定向URL”条目与以下模式匹配

    http://<你的服务器名称>/social/complete/slack/

    (注意:同一个应用可以有多个“重定向URL”。对于本地开发,您需要将localhost别名设置为所选子域名,具体请参考下面的“域名解析”部分。)

  • 可选: PostgreSQL — brew install postgresql

包含内容

./staff_auth/

处理员工Slack授权和认证的应用。

./staff_auth/templates/admin/login.html./staff_auth/static/staff_auth/css/custom-login.css

自定义HTML和CSS,将“员工登录(使用Slack)”按钮添加到标准的Django管理登录表单。

staff_auth.backend.WorkspaceSpecificSlackOAuth2

Python Social Auth的Slack认证后端的子类。与原始版本不同,这个版本强制用户使用指定Slack工作区的凭据登录(而不是任何Slack工作区的凭据)。

staff_auth.middleware.InvalidWorkspaceErrorMiddleware

一个中间件,监听Python Social Auth的AuthForbidden异常,并将它们映射到StaffAuthErrorView页面中的丰富输出。

staff_auth.pipeline.associate_by_email

一个函数,查找任何具有与签署者相同的电子邮件地址的现有Django用户,并将新登录绑定到同一账户——但前提是该用户之前已经有过独立的社会认证绑定。

staff_auth.pipeline.promote_staffer_to_staff

一个函数,当用户首次使用Slack凭据登录时,将所有Slack认证用户提升到“员工”状态(意味着他们可以登录Django管理)。

staff_auth.pipeline.promote_manager_to_superuser

一个函数,当用户首次使用Slack凭据登录时,将所有Slack认证用户提升到“超级用户”状态(意味着他们可以登录Django管理)——如果他们的Slack账户上的电子邮件地址与settings.MANAGERS列表中找到的电子邮件地址相匹配。

staff_auth.views.StaffAuthErrorView

如果用户尝试通过不同的Slack工作区登录,则显示给用户的错误页面。

(注意,此视图的HTML和CSS分别位于./staff_auth/templates/staff_auth/auth-error.html./staff_auth/static/staff_auth/css/page-styles.css。)

./example/

一个示例Django项目,展示了我们如何实现员工Slack访问。

在这个目录中,您将找到一个标准(如果有些简陋)的Django应用,包括顶层的一个示例.env文件、一个Pipfile和一个manage.py脚本。

exampleapp子目录中是此示例应用的settings.py文件(您可以在其中看到politico-staff-auth所需配置变量的示例实现),还有一个urls.py文件,用于演示如何执行这部分配置。标准辅助文件(包括wsgi.py)也可以在这个子目录中找到。

启动示例应用

  1. 将当前目录切换到这个README文件下一级的./example/目录,并安装依赖项。

    cd ./example/
    pipenv install
    
  2. .env.example模板创建一个新的.env文件,并插入适当的值。

    cp .env.example .env
    

    有关每个设置的详细信息,请参阅下面的“配置”部分。

  3. 创建一个新的空数据库,然后用必要的表填充它。

    make database
    pipenv run python manage.py migrate
    
  4. 启动Django测试服务器。

    pipenv run python manage.py runserver
    
  5. 导航到测试服务器上的管理站点,然后点击“员工登录”按钮。

安装

  1. 从PyPI安装

    pipenv install politico-staff-auth
    
  2. staff_authsocial_django添加到Django中已安装的应用列表。

    在项目的settings.py

    INSTALLED_APPS = [
      "staff_auth",
    
      # ...
      # Existing installed apps
      # ...
    
      "social_django",
    ]
    

    注意:在列表中,staff_auth应用必须排在第一位(或者至少在现有的django.contrib.admin行之前)。social_django行应出现在Django本身分发的所有应用之后。

  3. 添加员工的Slack工作区的凭据。

    在项目的settings.py

    STAFF_AUTH_SLACK_KEY = "auth-key"
    
    STAFF_AUTH_SLACK_SECRET = "secret-key"
    
    STAFF_AUTH_SLACK_TEAM = "my-value-here"
    

    有关这些值的更多信息,请参阅下面的“配置”部分。

    注意:我们建议从环境变量中读取这些值,但各有所好。

  4. 添加所需的中间件以实现丰富的登录错误消息。

    在项目的settings.py

    MIDDLEWARE = [
        # ...
        # Existing middleware
        # ...
    
        "staff_auth.middleware.InvalidWorkspaceErrorMiddleware",
    ]
    

    注意: staff_auth.middleware.InvalidWorkspaceErrorMiddleware 应该添加到现有的 MIDDLEWARE 列表末尾。

  5. 完成前面的步骤后,现在您可以实施基本的工作人员身份验证设置。

    在项目的settings.py

    from staff_auth.configured_settings import configure_staff_auth
    
    staff_auth_settings = configure_staff_auth(
        key=STAFF_AUTH_SLACK_KEY,
        secret=STAFF_AUTH_SLACK_SECRET,
        team=STAFF_AUTH_SLACK_TEAM,
    )
    
    for setting_name, setting_value in staff_auth_settings.items():
        globals()[setting_name] = setting_value
    
  6. 设置 Django 在用户被要求登录时使用 Slack 身份验证后端。

    在项目的settings.py

    LOGIN_URL = "staff_auth:slack-login"
    
  7. 连接 staff_authsocial_django 的 URL。

    在您项目的顶层 URLconf(urls.py 文件)中

    urlpatterns = [
      # ...
      # Existing URL patterns
      # ...
    
      path("social/", include("social_django.urls", namespace="social")),
      path("staff-auth/", include("staff_auth.urls")),
    ]
    
  8. 可选: 添加管道。

    在项目的settings.py

    SOCIAL_AUTH_PIPELINE = (
        "social_core.pipeline.social_auth.social_details",
        "social_core.pipeline.social_auth.social_uid",
        "social_core.pipeline.social_auth.auth_allowed",
        "social_core.pipeline.social_auth.social_user",
        "social_core.pipeline.user.get_username",
        "social_core.pipeline.user.create_user",
        "social_core.pipeline.social_auth.associate_user",
        "social_core.pipeline.social_auth.load_extra_data",
        "staff_auth.pipeline.promote_staffer_to_staff",
        "staff_auth.pipeline.promote_manager_to_superuser",
        "social_core.pipeline.user.user_details",
    )
    

    您可以禁用上面列出的 staff_auth.pipeline 类中的任意一个或两个,但请注意保留这里的顺序——重新排序这些管道可能会导致难以调试的不预期后果。

    注意: staff_auth.pipeline.promote_staffer_to_staffstaff_auth.pipeline.promote_manager_to_superuser 的行为在上述“内容”部分中描述。

    注意 2:如果您没有使用上述任一 staff_auth.pipeline 类,请跳过此步骤,并确保您的项目的 settings.py 文件没有设置 SOCIAL_AUTH_PIPELINE 值。

  9. 可选: 修改用户成功登录或注销后跳转到的 URL。

    这些都是标准的 Django 设置,可以是 URL 或命名 URL 模式(就像您传递给 {% url %} 模板标签一样)。

    在项目的settings.py

    LOGIN_REDIRECT_URL = "/my/url/pattern/"
    
    LOGOUT_REDIRECT_URL = "namespace:view-name"
    

    注意:有关更多信息,请参阅 Django 文档条目 此处此处

配置

设置 它的作用
STAFF_AUTH_SLACK_KEY 从您连接到工作区的 Slack "应用" 中获取的 'Client ID'。 作为 SOCIAL_AUTH_SLACK_KEY 传递给 Python Social Auth。
STAFF_AUTH_SLACK_SECRET 此 Slack "应用" 的 Client Secret。作为 SOCIAL_AUTH_SLACK_SECRET 传递给 Python Social Auth。
STAFF_AUTH_SLACK_TEAM 您的用户有账户的 Slack 工作区名称。(一个方便的记忆方法:它也是用户登录到使用 Slack 本身的 slack.com 子域。)作为 SOCIAL_AUTH_SLACK_TEAM 传递给 Python Social Auth。

版权

© 2019–present POLITICO LLC

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分发

politico-staff-auth-0.0.6.tar.gz (12.3 kB 查看哈希值

上传时间

由以下机构支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面