You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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身份处理逻辑:

  1. 编写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})
    
  2. 配置Django跨域权限:安装django-cors-headers并添加Forge应用域名到允许列表,避免跨域请求被拦截。

三、常见错误排查

  • PKCE未启用:Forge前端必须开启PKCE,否则Atlassian会直接拒绝授权请求。
  • 回调URL不匹配:Atlassian平台配置的回调URL需与代码中redirectUri完全一致,包括协议、域名、路径。
  • 权限不足:若无法获取用户邮箱,检查是否添加了read:email权限,且用户授权时同意了该权限。
  • Django会话问题:若API返回登录状态但前端未同步,可改用JWT令牌实现无状态登录。

内容的提问来源于stack exchange,提问作者user23556276

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 10:55:20