第1部分-立即提供服务
情景
你想做你自己的 Authorization Server 为特定API向客户端应用程序颁发访问令牌。
启动您的应用程序
在本教程中,您将从Heroku部署的应用程序向您的本地主机实例发布一条XHR帖子。由于发出请求的域(Heroku上的应用程序)与目标域(您的本地实例)不同,您需要安装 django-cors-headers 应用程序。默认情况下,Web浏览器禁止这些“跨域”请求,除非您使用 CORS 。
创建一个虚拟环境并安装 django-oauth-toolkit 和 django-cors-headers :
pip install django-oauth-toolkit django-cors-headers
启动Django项目,添加 oauth2_provider 和 corsheaders 到已安装的应用程序,并启用管理:
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 id 和 Client 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.com 或 http://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 然后注销(这只是测试授权过程所需要的,我们稍后会解释)