保护 Django OAuth Toolkit 视图

7
我们希望在后端实现Django OAuth,以便集成Alexa和其他第三方API。我们一直在遵循他们网站上的教程(http://django-oauth-toolkit.readthedocs.io/en/latest/tutorial/tutorial.html),但是我们遇到了一个安全问题,至今仍未解决:
任何用户都可以访问https://<oursite.com>/o/applications,这是否存在安全隐患?如果有,需要采取哪些措施来防止用户访问这些视图?
SO上唯一相关的问题并没有特别有用: 在Django OAuth Toolkit中安全创建新应用程序 禁用或限制/o/applications(django rest framework, oauth2)
3个回答

7
我正在做类似的事情,我认为任何人都可以看到/o/applications是一个安全问题 - 据我所知,该页面旨在成为开发实用工具,而不是生产页面。事实上,在django-oauth-toolkit文档中,他们有一个代码示例,其中对视图的访问权限更受限制。
from django.conf.urls import url
import oauth2_provider.views as oauth2_views
from django.conf import settings
from .views import ApiEndpoint

# OAuth2 provider endpoints
oauth2_endpoint_views = [
    url(r'^authorize/$', oauth2_views.AuthorizationView.as_view(), name="authorize"),
    url(r'^token/$', oauth2_views.TokenView.as_view(), name="token"),
    url(r'^revoke-token/$', oauth2_views.RevokeTokenView.as_view(), name="revoke-token"),
]

if settings.DEBUG:
    # OAuth2 Application Management endpoints
    oauth2_endpoint_views += [
        url(r'^applications/$', oauth2_views.ApplicationList.as_view(), name="list"),
        url(r'^applications/register/$', oauth2_views.ApplicationRegistration.as_view(), name="register"),
        url(r'^applications/(?P<pk>\d+)/$', oauth2_views.ApplicationDetail.as_view(), name="detail"),
        url(r'^applications/(?P<pk>\d+)/delete/$', oauth2_views.ApplicationDelete.as_view(), name="delete"),
        url(r'^applications/(?P<pk>\d+)/update/$', oauth2_views.ApplicationUpdate.as_view(), name="update"),
    ]

    # OAuth2 Token Management endpoints
    oauth2_endpoint_views += [
        url(r'^authorized-tokens/$', oauth2_views.AuthorizedTokensListView.as_view(), name="authorized-token-list"),
        url(r'^authorized-tokens/(?P<pk>\d+)/delete/$', oauth2_views.AuthorizedTokenDeleteView.as_view(),
            name="authorized-token-delete"),
    ]

urlpatterns = [
    # OAuth 2 endpoints:
    url(r'^o/', include(oauth2_endpoint_views, namespace="oauth2_provider")),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^api/hello', ApiEndpoint.as_view()),  # an example resource endpoint
]

撤销令牌视图是RFC的一部分,所以这个视图是必需的。在我的应用程序中,我采用了类似的方法,只包括AuthorizationView、TokenView和RevokeTokenView。

希望这有所帮助!


https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ 表示:“在生产中绝不能启用调试。” 因此,我认为他们正在给我们一个提示,让我们应该实现自己的访问控制来保护这些敏感的端点。 - David Chandler
是的,敏感端点完全是可选的,永远不应该在生产中使用。实际上,在我的情况下,完全将它们留空并通过Django Admin管理授权应用程序更容易。 - Noah Gilmore

6

这是一个安全问题,我建议只允许具有活跃账户的超级用户访问,比如下面在urls.py中的代码:

from django.contrib.auth.decorators import user_passes_test
import oauth2_provider.views as oauth2_views

def is_super(user):
    return user.is_superuser and user.is_active

oauth2_endpoint_views = [
    url(r'^authorize/$', oauth2_views.AuthorizationView.as_view(), name="authorize"),
    url(r'^token/$', oauth2_views.TokenView.as_view(), name="token"),
    url(r'^revoke-token/$', oauth2_views.RevokeTokenView.as_view(), name="revoke-token"),
    # the above are public but we restrict the following:
    url(r'^applications/$', user_passes_test(is_super)(oauth2_views.ApplicationList.as_view()), name="list"),
    ...
]
urlpatterns = [url(r'^o/', include(oauth2_endpoint_views, namespace="oauth2_provider"))]

嘿,我不太确定这与什么有关,特别是因为没有上下文说明它的作用。 - Nat Homer
明白了,有道理,谢谢。 - Nat Homer

2

如果要排除'applications/'端点,请仅导入所需的URL,而不是使用整个oauth2_provider.urls

最初的回答

from oauth2_provider.urls import app_name, base_urlpatterns, management_urlpatterns

urlpatterns = [
    ...
    # oauth2
    path('oauth2/', include((base_urlpatterns, app_name), namespace='oauth2_provider'))
]

只有用于客户端应用程序授权的URL将被添加:

最初的回答:

仅添加客户端应用程序授权所需的URL。

oauth2/ ^authorize/$ [name='authorize']
oauth2/ ^token/$ [name='token']
oauth2/ ^revoke_token/$ [name='revoke-token']
oauth2/ ^introspect/$ [name='introspect'] 

要添加/删除应用程序,您可以使用Django管理站点,或者允许管理员用户使用management_urlpatterns,如@David Chander的回答所示:https://dev59.com/0Jzha4cB1Zd3GeqPHZjv#49210935

最初的回答中提到,您可以使用Django管理站点或管理URL模式。如果您是管理员用户,则可以使用管理URL模式轻松地添加/删除应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接