Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django';s自定义身份验证中间件&;认证后端_Django_Django Authentication - Fatal编程技术网

Django';s自定义身份验证中间件&;认证后端

Django';s自定义身份验证中间件&;认证后端,django,django-authentication,Django,Django Authentication,我正在编写一个自定义身份验证中间件,用于检查报头中“授权”密钥的传入请求,该报头包含一个令牌 我使用此令牌与第三方(Microsoft Graph)检查用户的有效性。MS Graph将使用如下对象进行响应 # the response object { '@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users/$entity', 'businessPhones': ['xxx'], 'disp

我正在编写一个自定义身份验证中间件,用于检查报头中“授权”密钥的传入请求,该报头包含一个令牌

我使用此令牌与第三方(Microsoft Graph)检查用户的有效性。MS Graph将使用如下对象进行响应

# the response object

{
    '@odata.context': 'https://graph.microsoft.com/v1.0/$metadata#users/$entity',
    'businessPhones': ['xxx'],
    'displayName': 'xxx',
    'givenName': 'xxx',
    'id': 'xxx',
    'jobTitle': None,
    'mail': 'xxx',
    'mobilePhone': None,
    'officeLocation': None,
    'preferredLanguage': 'xxx',
    'surname': 'xxx',
    'userPrincipalName': 'xxx'
}
编辑:在此处添加自定义中间件代码:

类身份验证中间件(MiddlewareMixin):
如果未对request.user.u进行身份验证:
如果request.headers中有“Authorization”:
#使用给定的令牌向MS Graph发出请求
#获取用户详细信息并附加到请求
令牌=请求.头文件[“授权”]
request.GET中的elif“accessToken”:
令牌=请求。获取[“accessToken”]
其他:
令牌=无
如果令牌:
url=”https://graph.microsoft.com/v1.0/me/"
有效载荷={}
headers={“Authorization”:“Bearer{}.format(token)}
response=requests.request(“GET”,url,headers=headers,data=payload)
如果response.ok:
request.custom_user=response.json()
其他:
request.custom_user=匿名用户
其他:
request.custom_user=匿名用户
现在,我想将其设计为与Django的默认身份验证后端一样,具有适当的组和权限。如何使用LazyObject来检查用户的组成员资格和权限

更新

看起来还有一个自定义后端身份验证,其工作方式如下

它和我使用中间件做的事情一样吗

从django.contrib.auth.backends导入BaseBackend
类MyBackend(BaseBackend):
def身份验证(self、request、token=None):
#检查令牌并返回一个用户。
...

您应该定制如下所示的中间件,并将其添加到设置中的中间件中

class SimpleMedia软件:
定义初始化(自我,获取响应):
self.get\u response=get\u response
#一次性配置和初始化。
定义呼叫(自我,请求):
#之前为每个请求执行的代码
#该视图(以及更高版本的中间件)被称为。
响应=自我获取响应(请求)
#todo:做一些你想要的回应
返回响应
另见:

编辑:

它和我使用中间件做的事情一样吗

不,不是

最不同的是 后端用于连接数据库,中间件用于处理请求。您可以在
django.middleware
包中找到更多示例代码


如果您想定制如何将信息保存到数据库中,例如:customer使用
authenticate
方法,那么您应该为工作定制一个后端。否则,您可以定制一个中间件来处理所有请求。因为定制中间件很容易。

这是为了处理响应。就我而言,我想处理这个请求。我已经用自定义中间件的代码更新了这个问题。谢谢谢谢拜特史密斯!我会调查的。我同意中间件是处理请求/响应的。您的中间件中缺少一些代码,比如所有if语句所属的方法定义。此外,新代码不应使用MiddlewareMixin,而应符合1.10+中间件API。最终,兼容性mixin将消失(我相信是4.0,但不确定)。