我有一个 iOS 应用程序和一个用 Spring 编写的后端,实现了 OAuth2 mechanizm。
我的后端有一个signup
端点,它接受一些用户数据并返回一个 OAuth2 响应,例如
{
"access_token":"9154140d-b621-4391-9fdd-fbba9e5e4188",
"token_type":"bearer",
"refresh_token":"dd612036-7cc6-4858-a30f-c548fc2a823c",
"expires_in":89,
"scope":"write"
}
之后我想保存OIDAuthState
在我的钥匙串中,所以我执行以下操作:
func saveTokenResponse(responseDict: [String: NSCopying & NSObjectProtocol]) {
let redirectURI = URL(string: kRedirectURI)
let configuration = OIDServiceConfiguration(authorizationEndpoint: URL(string: kAuthorizationEndpoint)!, tokenEndpoint: URL(string: kTokenEndpoint)!)
let request = OIDAuthorizationRequest(configuration: configuration, clientId: self.kClientID, scopes: ["write"], redirectURL: redirectURI!, responseType: OIDResponseTypeCode, additionalParameters: nil)
let accessToken = responseDict["access_token"] ?? nil
let tokenType = responseDict["token_type"] ?? nil
let refreshToken = responseDict["refresh_token"] ?? nil
let expiresIn = responseDict["expires_in"] ?? nil
let scope = responseDict["scope"] ?? nil
let response = OIDAuthorizationResponse(request: request, parameters: [
"access_token": accessToken!,
"token_type": tokenType!,
"refresh_token": refreshToken!,
"expires_in": expiresIn!,
"scope": scope!
]
)
let authState = OIDAuthState(authorizationResponse: response) //here authState.refreshToken is nil, so it won't be serialized.
updateAuthState(authState: authState) // it just saves it in keychain
}
一切正常,但是令牌过期时我遇到了问题。应用程序调用后端并且 AppAuth 无法刷新令牌:
我可以看到,对象中不存在刷新令牌OIDAuthState
。我检查了OIDAuthState
from的初始化,OIDAuthorizationResponse
发现在这种情况下没有分配令牌。
任何人都可以帮助我OIDAuthState
从后端收到的 OAuth 响应中保存吗?还是我做错了什么?
谢谢,
奥斯曼