Heroku 是一个云平台即服务(PaaS),允许开发者快速部署和扩展应用程序。Django REST Framework (DRF) 是一个用于构建 Web API 的强大且灵活的工具包。Auth0 是一个身份验证即服务(IDaaS)提供商,提供用户身份验证和授权服务。
当你在本地主机上可以正确进行身份验证,但在 Auth0 托管的 Angular 应用程序上无法与 Heroku 托管的 DRF 应用程序进行对话时,可能的原因包括:
确保 Heroku 上的 DRF 应用程序允许来自 Auth0 托管的 Angular 应用程序的请求。你可以在 DRF 中配置 CORS 如下:
# settings.py
INSTALLED_APPS = [
...
'corsheaders',
...
]
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = [
'https://your-angular-app.auth0.com', # 替换为你的 Auth0 域名
]
确保 Angular 应用程序在向 DRF 应用程序发送请求时正确传递了认证令牌。你可以在 Angular 中使用 HttpClient
并设置请求头:
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);
});
确保 DRF 的认证后端能够正确处理来自 Auth0 的令牌。你可以使用 TokenAuthentication
或自定义认证后端:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
# 添加自定义认证后端
'your_app.backends.Auth0Authentication',
],
}
自定义认证后端示例:
# 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 应用程序进行对话的问题。
没有搜到相关的沙龙
领取专属 10元无门槛券
手把手带您无忧上云