使用 SAML 的 Dropbox 和 Django SSO
Dropbox and Django SSO using SAML
总结
我希望通过使用来自 Django 站点的身份验证来使用 Dropbox SSO 功能。请注意,我不希望使用 SAML 作为我的 Django 站点的后端。
资源
1) Dropbox 自定义 SSO 帮助页面:https://www.dropbox.com/en/help/1921#custom
2) 创建 SAML 响应:https://robinelvin.wordpress.com/2009/09/04/saml-with-django/
3) 努力从 Google 中找到任何进行这种 SSO 的人的例子。很多 link 关于人们使用 SAML 作为 Django 后端的文章。
问题
在保管箱管理设置中,我可以添加我的 X509 证书和登录名 link。这意味着当您尝试使用 SSO 登录 Dropbox 时,它会使用查询字符串中带有 SAMLRequest 的 GET 请求将您很好地转发到我的 Django 站点的登录页面。
但是,我的理解是,一旦用户在 Django 站点上通过身份验证,我现在需要在他们的 SAML 登录 link 处向 Dropbox 发送一个 POST 请求,其中包含一个 SAMLResponse post 数据。使用上面的第二个资源,我相信我可以创建 SAMLResponse xml,但我不确定如何使用我的 Django 视图中的 SAML 数据将用户重定向到保管箱 SAML 登录 link。
非常感谢任何帮助。
设法使用 django-saml2-idp
https://github.com/peopledoc/django-saml2-idp
获得我需要的功能
关于安装的好文档:https://github.com/peopledoc/django-saml2-idp/blob/master/doc/INSTALL.txt
Dropbox 管理控制台中的设置需要 X509 证书,然后登录 url 设置为:https://****.com/idp/login
请注意,我在安装 M2Crypto 依赖项时遇到问题,因此通过以下方式使用了 Ubuntu 包:
sudo apt-get install python-m2crypto
此外,我使用的是 Django 1.9.6,因此需要覆盖 views.py
、urls.py
和 registry.py
文件以使它们兼容(需要更新各种导入语句并且 urls 更改为新的列表格式而不是使用模式)。
创建了一个 Dropbox 处理器,如下所示:
import base64
import zlib
from saml2idp import base
from saml2idp.xml_render import _get_assertion_xml
def get_assertion_dropbox_xml(parameters, signed=False):
return _get_assertion_xml(ASSERTION_DROPBOX, parameters, signed)
ASSERTION_DROPBOX = (
'<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" '
'ID="${ASSERTION_ID}" '
'IssueInstant="${ISSUE_INSTANT}" '
'Version="2.0">'
'<saml:Issuer>${ISSUER}</saml:Issuer>'
'${ASSERTION_SIGNATURE}'
'${SUBJECT_STATEMENT}'
'<saml:Conditions NotBefore="${NOT_BEFORE}" NotOnOrAfter="${NOT_ON_OR_AFTER}">'
'<saml:AudienceRestriction>'
'<saml:Audience>${AUDIENCE}</saml:Audience>'
'</saml:AudienceRestriction>'
'</saml:Conditions>'
'<saml:AuthnStatement AuthnInstant="${AUTH_INSTANT}"'
'>'
'<saml:AuthnContext>'
'<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>'
'</saml:AuthnContext>'
'</saml:AuthnStatement>'
'${ATTRIBUTE_STATEMENT}'
'</saml:Assertion>'
)
class Processor(base.Processor):
def _decode_request(self):
"""
Decodes _request_xml from _saml_request.
"""
self._request_xml = zlib.decompress(base64.b64decode(self._saml_request), -15)
def _format_assertion(self):
self._assertion_xml = get_assertion_dropbox_xml(self._assertion_params, signed=False)
您在 settings.py
文件中注册如下:
SAML2IDP_CONFIG = {
'autosubmit': True,
'certificate_file': '/****/certificate.pem',
'private_key_file': '/****/private-key.pem',
'issuer': 'https://www.****.com',
'signing': True,
}
sampleSpConfig = {
'acs_url': 'https://www.dropbox.com/saml_login',
'processor': 'dropbox.Processor',
}
SAML2IDP_REMOTES = {
'sample': sampleSpConfig,
}
如梦如幻。希望这可以帮助那里的人。
总结
我希望通过使用来自 Django 站点的身份验证来使用 Dropbox SSO 功能。请注意,我不希望使用 SAML 作为我的 Django 站点的后端。
资源
1) Dropbox 自定义 SSO 帮助页面:https://www.dropbox.com/en/help/1921#custom
2) 创建 SAML 响应:https://robinelvin.wordpress.com/2009/09/04/saml-with-django/
3) 努力从 Google 中找到任何进行这种 SSO 的人的例子。很多 link 关于人们使用 SAML 作为 Django 后端的文章。
问题
在保管箱管理设置中,我可以添加我的 X509 证书和登录名 link。这意味着当您尝试使用 SSO 登录 Dropbox 时,它会使用查询字符串中带有 SAMLRequest 的 GET 请求将您很好地转发到我的 Django 站点的登录页面。
但是,我的理解是,一旦用户在 Django 站点上通过身份验证,我现在需要在他们的 SAML 登录 link 处向 Dropbox 发送一个 POST 请求,其中包含一个 SAMLResponse post 数据。使用上面的第二个资源,我相信我可以创建 SAMLResponse xml,但我不确定如何使用我的 Django 视图中的 SAML 数据将用户重定向到保管箱 SAML 登录 link。
非常感谢任何帮助。
设法使用 django-saml2-idp
https://github.com/peopledoc/django-saml2-idp
关于安装的好文档:https://github.com/peopledoc/django-saml2-idp/blob/master/doc/INSTALL.txt
Dropbox 管理控制台中的设置需要 X509 证书,然后登录 url 设置为:https://****.com/idp/login
请注意,我在安装 M2Crypto 依赖项时遇到问题,因此通过以下方式使用了 Ubuntu 包:
sudo apt-get install python-m2crypto
此外,我使用的是 Django 1.9.6,因此需要覆盖 views.py
、urls.py
和 registry.py
文件以使它们兼容(需要更新各种导入语句并且 urls 更改为新的列表格式而不是使用模式)。
创建了一个 Dropbox 处理器,如下所示:
import base64
import zlib
from saml2idp import base
from saml2idp.xml_render import _get_assertion_xml
def get_assertion_dropbox_xml(parameters, signed=False):
return _get_assertion_xml(ASSERTION_DROPBOX, parameters, signed)
ASSERTION_DROPBOX = (
'<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" '
'ID="${ASSERTION_ID}" '
'IssueInstant="${ISSUE_INSTANT}" '
'Version="2.0">'
'<saml:Issuer>${ISSUER}</saml:Issuer>'
'${ASSERTION_SIGNATURE}'
'${SUBJECT_STATEMENT}'
'<saml:Conditions NotBefore="${NOT_BEFORE}" NotOnOrAfter="${NOT_ON_OR_AFTER}">'
'<saml:AudienceRestriction>'
'<saml:Audience>${AUDIENCE}</saml:Audience>'
'</saml:AudienceRestriction>'
'</saml:Conditions>'
'<saml:AuthnStatement AuthnInstant="${AUTH_INSTANT}"'
'>'
'<saml:AuthnContext>'
'<saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef>'
'</saml:AuthnContext>'
'</saml:AuthnStatement>'
'${ATTRIBUTE_STATEMENT}'
'</saml:Assertion>'
)
class Processor(base.Processor):
def _decode_request(self):
"""
Decodes _request_xml from _saml_request.
"""
self._request_xml = zlib.decompress(base64.b64decode(self._saml_request), -15)
def _format_assertion(self):
self._assertion_xml = get_assertion_dropbox_xml(self._assertion_params, signed=False)
您在 settings.py
文件中注册如下:
SAML2IDP_CONFIG = {
'autosubmit': True,
'certificate_file': '/****/certificate.pem',
'private_key_file': '/****/private-key.pem',
'issuer': 'https://www.****.com',
'signing': True,
}
sampleSpConfig = {
'acs_url': 'https://www.dropbox.com/saml_login',
'processor': 'dropbox.Processor',
}
SAML2IDP_REMOTES = {
'sample': sampleSpConfig,
}
如梦如幻。希望这可以帮助那里的人。