如何通过Atlassian为外部Django应用实现SSO及Forge应用Jira自动登录?
可行性与解决方案
完全可以实现用户点击Forge应用的连接按钮后,通过Jira(Atlassian)凭据自动登录Django应用。核心是通过Atlassian OAuth 2.0授权码流程获取用户身份信息,再与你的Django用户系统关联,完成自动登录。以下是针对你配置失败问题的具体解决步骤:
一、修正Forge应用的Atlassian OAuth2配置
- 在Atlassian开发者平台的Forge应用设置中,确保OAuth2配置符合要求:
- 授权类型选择
Authorization Code,且必须开启PKCE(Forge前端属于公共客户端,Atlassian强制要求PKCE)。 - 回调URL需与Forge代码中指定的
redirectUri完全一致,可使用Forge提供的本地回调(如forge://auth/callback)或应用域名路由。 - 添加必要权限范围:至少包含
read:me(获取用户基本信息)、read:email(获取邮箱用于关联Django用户)。
- 授权类型选择
- 使用Atlassian官方
@forge/oauth包发起授权请求,避免手动拼接参数导致的错误:import { requestOAuth2Authorization } from '@forge/oauth'; const handleConnect = async () => { try { const authData = await requestOAuth2Authorization({ clientId: '<你的Atlassian OAuth客户端ID>', scopes: ['read:me', 'read:email'], redirectUri: '<你的回调URL>', pkce: true }); // 将授权码传给Django服务端换取用户信息 const res = await fetch('<你的Django API地址>/exchange-atlassian-code', { method: 'POST', body: JSON.stringify({ code: authData.code, redirect_uri: '<你的回调URL>' }), headers: { 'Content-Type': 'application/json' } }); const userData = await res.json(); // 同步Django登录状态到Forge应用 } catch (err) { console.error('授权失败:', err); } };
二、Django服务端适配(关联Atlassian身份)
基于你已搭建的django-oauth-toolkit服务端,添加Atlassian身份处理逻辑:
- 编写API接口接收Forge传来的授权码,换取Atlassian访问令牌并获取用户信息:
import requests from django.http import JsonResponse from django.contrib.auth import login from django.contrib.auth.models import User def exchange_atlassian_code(request): if request.method != 'POST': return JsonResponse({'error': '无效请求方法'}, status=405) code = request.POST.get('code') redirect_uri = request.POST.get('redirect_uri') # 换取Atlassian访问令牌 token_res = requests.post( 'https://auth.atlassian.com/oauth/token', data={ 'grant_type': 'authorization_code', 'client_id': '<你的Atlassian OAuth客户端ID>', 'client_secret': '<你的Atlassian OAuth客户端密钥>', 'code': code, 'redirect_uri': redirect_uri } ) token_data = token_res.json() if 'access_token' not in token_data: return JsonResponse({'error': '获取令牌失败'}, status=400) # 获取用户身份信息 user_info_res = requests.get( 'https://api.atlassian.com/me', headers={'Authorization': f'Bearer {token_data["access_token"]}'} ) user_info = user_info_res.json() # 关联或创建Django用户 try: user = User.objects.get(email=user_info['email']) except User.DoesNotExist: user = User.objects.create_user( username=user_info['account_id'], email=user_info['email'], password=None # 第三方登录无需本地密码 ) # 自动登录用户(API场景可返回JWT令牌替代会话登录) login(request, user) return JsonResponse({'user_id': user.id, 'email': user.email}) - 配置Django跨域权限:安装
django-cors-headers并添加Forge应用域名到允许列表,避免跨域请求被拦截。
三、常见错误排查
- PKCE未启用:Forge前端必须开启PKCE,否则Atlassian会直接拒绝授权请求。
- 回调URL不匹配:Atlassian平台配置的回调URL需与代码中
redirectUri完全一致,包括协议、域名、路径。 - 权限不足:若无法获取用户邮箱,检查是否添加了
read:email权限,且用户授权时同意了该权限。 - Django会话问题:若API返回登录状态但前端未同步,可改用JWT令牌实现无状态登录。
内容的提问来源于stack exchange,提问作者user23556276
相关产品推荐
相关产品推荐

