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

iOS平台从钥匙串获取AWS Cognito令牌相关技术问询

AWS Cognito iOS令牌存储与访问指南

1. AWS Cognito是否将认证令牌存储在iOS钥匙串中?

是的,AWS Cognito官方iOS SDK(AWSMobileClient)默认会将access token、refresh token、ID token存储在iOS系统钥匙串中。这是SDK的默认安全行为,钥匙串会加密存储这些敏感数据,仅当前应用可访问。

2. 钥匙串对应的服务名和账户名是什么?

  • 服务名:格式为 com.amazonaws.AWSCognitoIdentityProviderService.<你的用户池ID>,例如用户池ID为us-east-1_XXXXXXXXX时,服务名就是com.amazonaws.AWSCognitoIdentityProviderService.us-east-1_XXXXXXXXX。
  • 账户名:通常使用用户在Cognito用户池中的唯一标识符sub(该值固定不变),部分场景下也可能使用用户名,但sub是更可靠的唯一标识。

3. 编程方式访问令牌的方法

推荐方式:使用AWSMobileClient SDK(官方封装)

直接调用SDK提供的API获取会话令牌,无需手动操作钥匙串,避免和SDK的存储逻辑冲突。

Swift代码示例

import AWSMobileClient

// 获取当前用户会话令牌
AWSMobileClient.default().getTokens { (tokens, error) in
    if let error = error {
        print("获取令牌失败: \(error.localizedDescription)")
        return
    }
    
    guard let tokens = tokens else {
        print("无可用令牌")
        return
    }
    
    // 提取各类令牌字符串
    let accessToken = tokens.accessToken?.tokenString
    let refreshToken = tokens.refreshToken?.tokenString
    let idToken = tokens.idToken?.tokenString
    
    print("Access Token: \(accessToken ?? "")")
    print("Refresh Token: \(refreshToken ?? "")")
    print("ID Token: \(idToken ?? "")")
}

Objective-C代码示例

#import <AWSMobileClient/AWSMobileClient.h>

// 获取当前用户会话令牌
[[AWSMobileClient defaultMobileClient] getTokens:^(AWSCognitoIdentityUserSession * _Nullable tokens, NSError * _Nullable error) {
    if (error) {
        NSLog(@"获取令牌失败: %@", error.localizedDescription);
        return;
    }
    
    if (!tokens) {
        NSLog(@"无可用令牌");
        return;
    }
    
    // 提取各类令牌字符串
    NSString *accessToken = tokens.accessToken.tokenString;
    NSString *refreshToken = tokens.refreshToken.tokenString;
    NSString *idToken = tokens.idToken.tokenString;
    
    NSLog(@"Access Token: %@", accessToken);
    NSLog(@"Refresh Token: %@", refreshToken);
    NSLog(@"ID Token: %@", idToken);
}];

进阶方式:直接操作钥匙串(不推荐,除非特殊需求)

若需手动读取钥匙串中的令牌,可使用iOS的Security框架,但需注意SDK可能更新存储逻辑,直接操作存在兼容性风险。

Swift代码示例(读取钥匙串)

import Security

func getTokenFromKeychain(service: String, account: String) -> String? {
    let query: [CFString: Any] = [
        kSecClass: kSecClassGenericPassword,
        kSecAttrService: service,
        kSecAttrAccount: account,
        kSecReturnData: kCFBooleanTrue!,
        kSecMatchLimit: kSecMatchLimitOne
    ]
    
    var data: AnyObject?
    let status = SecItemCopyMatching(query as CFDictionary, &data)
    
    guard status == errSecSuccess, let tokenData = data as? Data else {
        return nil
    }
    
    return String(data: tokenData, encoding: .utf8)
}

// 使用示例(替换为你的服务名和账户名)
let serviceName = "com.amazonaws.AWSCognitoIdentityProviderService.us-east-1_XXXXXXXXX"
let accountName = "用户的sub值"
if let token = getTokenFromKeychain(service: serviceName, account: accountName) {
    print("从钥匙串读取的令牌: \(token)")
}

Objective-C代码示例(读取钥匙串)

#import <Security/Security.h>

- (NSString *)getTokenFromKeychainWithService:(NSString *)service account:(NSString *)account {
    NSDictionary *query = @{
        (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
        (__bridge id)kSecAttrService: service,
        (__bridge id)kSecAttrAccount: account,
        (__bridge id)kSecReturnData: (__bridge id)kCFBooleanTrue,
        (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitOne
    };
    
    CFTypeRef dataRef = NULL;
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataRef);
    
    if (status != errSecSuccess) {
        return nil;
    }
    
    NSData *tokenData = (__bridge_transfer NSData *)dataRef;
    return [[NSString alloc] initWithData:tokenData encoding:NSUTF8StringEncoding];
}

// 使用示例(替换为你的服务名和账户名)
NSString *serviceName = @"com.amazonaws.AWSCognitoIdentityProviderService.us-east-1_XXXXXXXXX";
NSString *accountName = @"用户的sub值";
NSString *token = [self getTokenFromKeychainWithService:serviceName account:accountName];
if (token) {
    NSLog(@"从钥匙串读取的令牌: %@", token);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:26:31