首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

heroku DRF在本地主机上可以正确进行身份验证,但在auth0托管的angular应用程序上无法与heroku托管的DRF应用程序进行对话

基础概念

Heroku 是一个云平台即服务(PaaS),允许开发者快速部署和扩展应用程序。Django REST Framework (DRF) 是一个用于构建 Web API 的强大且灵活的工具包。Auth0 是一个身份验证即服务(IDaaS)提供商,提供用户身份验证和授权服务。

问题分析

当你在本地主机上可以正确进行身份验证,但在 Auth0 托管的 Angular 应用程序上无法与 Heroku 托管的 DRF 应用程序进行对话时,可能的原因包括:

  1. 跨域资源共享(CORS)问题:浏览器出于安全考虑,限制了从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。
  2. 认证令牌传递问题:在 Angular 应用程序和 DRF 应用程序之间传递认证令牌时可能出现了问题。
  3. 认证后端配置问题:DRF 的认证后端可能没有正确配置以处理来自 Auth0 的令牌。

解决方案

1. 配置 CORS

确保 Heroku 上的 DRF 应用程序允许来自 Auth0 托管的 Angular 应用程序的请求。你可以在 DRF 中配置 CORS 如下:

代码语言:txt
复制
# settings.py
INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
    'https://your-angular-app.auth0.com',  # 替换为你的 Auth0 域名
]

2. 配置认证令牌传递

确保 Angular 应用程序在向 DRF 应用程序发送请求时正确传递了认证令牌。你可以在 Angular 中使用 HttpClient 并设置请求头:

代码语言:txt
复制
import { HttpClient, HttpHeaders } from '@angular/common/http';

const httpOptions = {
  headers: new HttpHeaders({
    'Authorization': 'Bearer ' + yourAccessToken  // 替换为你的访问令牌
  })
};

this.http.get('https://your-drf-app.herokuapp.com/api/endpoint', httpOptions)
  .subscribe(data => {
    console.log(data);
  });

3. 配置 DRF 认证后端

确保 DRF 的认证后端能够正确处理来自 Auth0 的令牌。你可以使用 TokenAuthentication 或自定义认证后端:

代码语言:txt
复制
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        # 添加自定义认证后端
        'your_app.backends.Auth0Authentication',
    ],
}

自定义认证后端示例:

代码语言:txt
复制
# your_app/backends.py
from rest_framework import authentication
from rest_framework import exceptions

class Auth0Authentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        auth_header = authentication.get_authorization_header(request).split()

        if not auth_header or auth_header[0].lower() != b'bearer':
            return None

        if len(auth_header) == 1:
            msg = 'Invalid token header. No credentials provided.'
            raise exceptions.AuthenticationFailed(msg)
        elif len(auth_header) > 2:
            msg = 'Invalid token header. Token string should not contain spaces.'
            raise exceptions.AuthenticationFailed(msg)

        try:
            token = auth_header[1].decode('utf-8')
        except UnicodeError:
            msg = 'Invalid token header. Token string should not contain invalid characters.'
            raise exceptions.AuthenticationFailed(msg)

        # 验证令牌逻辑
        user = self.validate_token(token)

        if not user:
            raise exceptions.AuthenticationFailed('Invalid token.')

        return (user, None)

    def validate_token(self, token):
        # 实现验证令牌的逻辑
        pass

参考链接

通过以上步骤,你应该能够解决在 Auth0 托管的 Angular 应用程序上无法与 Heroku 托管的 DRF 应用程序进行对话的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 领券