我正在开发一个具有以下架构的项目:
UI:通过节点服务器,Apollo Client for GraphQL对客户端和服务器端呈现进行反应,
API:Django通过Graphene处理GraphQL查询。
我使用Auth0(基于JWT)进行前端身份验证。我想在GraphQL查询API端的上下文中使用我获得的令牌来验证我的用户。
[EDIT2]
要将令牌传递给我的API,我使用:
const idToken = cookie.load('idToken') || null;
networkInterface.use([{
applyMiddleware(req, next) {
if (!req.options.headers) {
req.options.headers = {}; // Create the header object if needed.
}
req.options.headers.authorization = `Bearer ${idToken}`;
next();
}
}]);
然后我需要在Django中检索它:我使用django-jwt-auth和@Craig Ambrose提出的代码。
接收并解码了我的授权标头(我可以获得有效负载),但在验证签名时出现问题:我收到“解码签名时出错。”
这很奇怪,因为我在jwt.io上测试时验证了签名。
如何在Django端进行身份验证?
答案 0 :(得分:5)
我刚刚使用django-jwt-auth(不使用Auth0)完成此操作
该软件包提供了一个JSONWebTokenAuthMixin,您可以将其与graphene_django中的GraphQLView结合使用。
from jwt_auth.mixins import JSONWebTokenAuthMixin
class AuthGraphQLView(JSONWebTokenAuthMixin, GraphQLView):
pass
urlpatterns = [
url(r'^graphql', csrf_exempt(AuthGraphQLView.as_view(schema=schema))),
url(r'^graphiql', include('django_graphiql.urls')),
]
这样可行,但我发现graphiql停止工作,因为它没有发送到令牌。我想继续使用基于cookie的身份验证,出于开发目的,所以将其更改为以下内容。
from jwt_auth.mixins import JSONWebTokenAuthMixin
class OptionalJWTMixin(JSONWebTokenAuthMixin):
def dispatch(self, request, *args, **kwargs):
auth = get_authorization_header(request)
if auth:
return super(OptionalJWTMixin, self).dispatch(request, *args, **kwargs)
else:
return super(JSONWebTokenAuthMixin, self).dispatch(request, *args, **kwargs)
class AuthGraphQLView(OptionalJWTMixin, GraphQLView):
pass
urlpatterns = [
url(r'^graphql', csrf_exempt(AuthGraphQLView.as_view(schema=schema))),
url(r'^graphiql', include('django_graphiql.urls')),
]
答案 1 :(得分:0)
我的设置现在正在运行:
我使用了来自@Craig Ambrose和django-jwt-auth的代码。我不得不在Github上分发包来处理Audience' aud' Auth0令牌中存在的有效载荷。
def jwt_get_user_id_from_payload_handler(payload):
sub = payload.get('sub')
Auth0User = import_string('project.models.Auth0User')
auth0_user = Auth0User.objects.filter(auth0_id=sub)[0]
user_id = auth0_user.user.id
return user_id
JWT_PAYLOAD_GET_USER_ID_HANDLER = jwt_get_user_id_from_payload_handler
auth0_key = '<MyAuth0SECRET>'
JWT_SECRET_KEY = base64.b64decode(auth0_key.replace("_","/").replace("-","+"))
JWT_VERIFY = True
JWT_AUTH_HEADER_PREFIX = 'Bearer'
JWT_AUDIENCE = '<MyAuth0CLIENT_ID>'
使用Aut0User一个与经典Django用户具有OnoToOne关系的模型和一个具有auth0_id的字段。