第1部分-立即提供服务

情景

你想做你自己的 Authorization Server 为特定API向客户端应用程序颁发访问令牌。

启动您的应用程序

在本教程中,您将从Heroku部署的应用程序向您的本地主机实例发布一条XHR帖子。由于发出请求的域(Heroku上的应用程序)与目标域(您的本地实例)不同,您需要安装 django-cors-headers 应用程序。默认情况下,Web浏览器禁止这些“跨域”请求,除非您使用 CORS

创建一个虚拟环境并安装 django-oauth-toolkitdjango-cors-headers

pip install django-oauth-toolkit django-cors-headers

启动Django项目,添加 oauth2_providercorsheaders 到已安装的应用程序,并启用管理:

INSTALLED_APPS = {
    'django.contrib.admin',
    # ...
    'oauth2_provider',
    'corsheaders',
}

将Django OAuth工具包URL包含在 urls.py ,选择您喜欢的urlspace。例如:

from django.urls import path, include

urlpatterns = [
    path("admin", admin.site.urls),
    path("o/", include('oauth2_provider.urls', namespace='oauth2_provider')),
    # ...
]

将CORS中间件包含在您的 settings.py

CorsMiddleware应该放在尽可能高的位置,特别是在任何可以生成响应的中间件之前,比如Django的CommonMiddleware或Whitenoise的WhiteNoiseMiddleware。如果不是以前的版本,它将无法将CORS报头添加到这些响应中。

MIDDLEWARE = (
    # ...
    'corsheaders.middleware.CorsMiddleware',
    # ...
)

允许来自所有域的CORS请求(仅限于本教程的范围):

CORS_ORIGIN_ALLOW_ALL = True

在登录模板中包括所需的隐藏输入, registration/login.html. The {{ next }} template context variable will be populated with the correct redirect value. See the Django documentation 以了解有关使用登录模板的详细信息。

<input type="hidden" name="next" value="{{ next }}" />

最后一步,执行Migrate命令,启动内部服务器,并使用您的凭据登录。

创建OAuth2客户端应用程序

在您的 Application 可以使用 Authorization Server 对于用户登录,您必须首先注册应用程序(也称为 Client 。)一旦注册,你的应用程序将被授予访问API的权限,这取决于其用户的批准。

让我们来注册您的申请。

您需要先登录,然后才能注册。因此,请访问http://localhost:8000/admin并登录。之后,将浏览器指向http://localhost:8000/o/applications/并添加一个应用程序实例。 Client idClient Secret 是自动生成的;您必须提供其余信息:

  • User :应用程序的所有者(例如,开发人员或当前登录的用户。)

  • Redirect uris: Applications must register at least one redirection endpoint before using the authorization endpoint. The Authorization Server will deliver the access token to the client only if the client specifies one of the verified redirection uris. For this tutorial, paste verbatim the value https://www.getpostman.com/oauth2/callback

  • Allowed origins :基于浏览器的客户端使用跨域资源共享(CORS)从自己的来源以外的来源请求资源。为令牌终结点提供以空格分隔的允许来源列表。原点必须为 "://" [ ":" ] ,例如 https://login.mydomain.comhttp://localhost:3000 。验证这些URL时,不会考虑查询字符串和哈希信息。这不包括‘重定向URI’或‘注销后重定向URI’,如果这些域也将使用令牌终结点,则它们必须包括在此列表中。

  • Client type :此值影响在客户端应用程序和授权服务器之间执行某些通信的安全级别。对于本教程,请选择 Confidential

  • Authorization grant type :选择 Authorization code

  • Name :这是服务器上客户端应用程序的名称,将显示在授权请求页面上,用户可以在该页面上允许/拒绝访问其数据。

  • Hash client secret :选中此项将在保存时散列客户端机密,以便以后无法检索。如果您计划通过使用OIDC,则应取消选中此选项 HS256 并希望使用JWT检查令牌的签名。否则,Django OAuth工具包无法使用 Client Secret 对令牌进行签名(因为稍后无法检索),签名时将使用哈希值。这可能会导致与OIDC依赖方的一些库不兼容。

请注意 Client id 以及 Client Secret 然后注销(这只是测试授权过程所需要的,我们稍后会解释)

测试您的授权服务器

您的授权服务器已准备就绪,可以开始颁发访问令牌。要测试该流程,您需要一个OAuth2使用者;如果您足够熟悉OAuth2,则可以使用cURL、请求或任何可以使用HTTP的工具。

对于本教程,我们建议使用 Postman

打开请求下的授权选项卡,并在本教程中按如下方式设置字段:

  • 授予类型: Authorization code (With PKCE)

  • 回调URL: https://www.getpostman.com/oauth2/callback <-需要在您添加的应用程序中

  • 使用浏览器授权:不选中

  • 身份验证URL: http://localhost:8000/o/authorize/

  • 访问令牌URL: http://localhost:8000/o/token/

  • 客户端ID: random string for this app, as generated

  • 客户端密码: random string for this app, as generated <-必须在哈希之前,不应以‘pbkdf2_sha256’或类似字符开头

其余部分可以保留其缺省值(大部分为空)。

授权应用程序

当用户点击该链接时,她会被重定向到您的(可能是本地的) Authorization Server 。如果您没有登录,系统将提示您输入用户名和密码。这是因为授权页面受django-oauth-TOOLKIT登录保护。登录,然后您应该看到用户可以用来授权客户端应用程序的(不是很可爱的)表单。标记该标记 Allow 复选框并单击 Authorize ,您将再次被重定向至消费者服务。

可能的错误:

  • 登录模板:如果在成功登录后没有被重定向到正确的页面,您可能需要 setup your login template correctly

  • 无效的客户端:客户端ID和客户端密码必须正确。创建后不能从Django admin复制密码。(但你可以通过将相同的随机字符串粘贴到Django admin和Postman中来重置它,以避免重新创建应用程序)

  • 无效的回调URL:在Django管理中将邮递员链接添加到您的应用程序中。

  • INVALID_REQUEST:使用邮递员提供的“授权码(带PCKE)”或在Django中禁用PKCE

兑换令牌

此时,您的授权服务器将用户重定向到消费者上的一个特殊页面,并将 Authorization Code 消费者将用来获取最终访问令牌的特殊令牌。

如果一切正常,您将被路由到另一个页面,显示您的访问令牌、令牌类型、其生存期和 Refresh Token

刷新令牌

该页显示从 Authorization Server 还允许您向服务器本身发出POST请求,以将刷新令牌交换为另一个全新的访问令牌。只需填写缺少的表单域并单击刷新按钮:如果一切顺利,您将看到访问和刷新令牌更改它们的值,否则您可能会看到一条错误消息。当您使用完授权服务器后,请注意访问令牌和刷新令牌,我们将在本教程的下一部分中使用它们。

因此,让我们创建一个API,并在 part 2 of the tutorial