gpt4 book ai didi

ios - 在 iOS 上使用 OAuth2 进行身份验证

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:40 27 4
gpt4 key购买 nike

我目前正在尝试使用 OAuth2 授权我的用户。我目前正在使用以下库:https://github.com/p2/OAuth2

let oauth2 = OAuth2CodeGrant(settings: [
"client_id": "my-id",
"authorize_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://www.googleapis.com/oauth2/v3/token",
"scope": "profile", // depends on the API you use
"redirect_uris": ["com.TestAuthorizeApp:/oauth2Callback"],
])

//let oauth2 = OAuth2CodeGrant(settings: settings)
oauth2.onAuthorize = { parameters in
print("Did authorize with parameters: \(parameters)")
}
oauth2.onFailure = { error in // `error` is nil on cancel
if let error = error {
print("Authorization went wrong: \(error)")
}
}

oauth2.authConfig.authorizeEmbedded = false
oauth2.authorize()

当我运行它时,它会在浏览器中加载 google,并且我能够登录。然后它会询问我在范围内声明的权限并且工作正常。我单击“确定打开”,它会将我重定向回我的应用。

但是,当我再次运行此代码时,我希望访问 token 已存储在 key 链中。然而,这似乎不起作用。

我查看了源代码并发现了以下检查:tryToObtainAccessTokenIfNeeded 始终返回 false。这意味着我再次获得需要单击“允许”的页面。

我想知道是否有人可以帮我弄清楚为什么它没有在钥匙串(keychain)中保存任何东西。这是否也意味着用户并未真正通过身份验证?

谢谢。

===

编辑

根据 Pascal 的评论添加了 oauth2.verbose = true。我得到以下输出。

 OAuth2: Looking for items in keychain
OAuth2: No access token, maybe I can refresh
OAuth2: I don't have a refresh token, not trying to refresh

这就是我认为正在发生的事情。但是我仍然不确定为什么它没有在钥匙串(keychain)中保存/找到任何东西。

=====

编辑2

事实证明,我实际上根本没有取回访问 token 。请看这段对话:https://github.com/p2/OAuth2/issues/109以及我在下面的回答。

最佳答案

在 Pascal 的帮助下:https://github.com/p2/OAuth2/issues/109我已经设法让它工作了。事实证明我没有像我应该的那样实现步骤:“3 授权用户”。

所以一个完整的解决方案是:

在我的 View Controller 中,我有以下内容:

let OAuth2AppDidReceiveCallbackNotification = "OAuth2AppDidReceiveCallback"

override func viewDidLoad() {
super.viewDidLoad()

// This notification is for handling step 3 in guide.
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ViewController.handleRedirect(_:)), name: OAuth2AppDidReceiveCallbackNotification, object: nil)
}

func authoriseUser {
let oauth2 = OAuth2CodeGrant(settings: [
"client_id": "my-id", // Use own client_id here
"authorize_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://www.googleapis.com/oauth2/v3/token",
"scope": "profile", // depends on the API you use
"redirect_uris": ["com.TestAuthorizeApp:/oauth2Callback"],
])

//let oauth2 = OAuth2CodeGrant(settings: settings)
oauth2.onAuthorize = { parameters in
print("Did authorize with parameters: \(parameters)")
}
oauth2.onFailure = { error in // `error` is nil on cancel
if let error = error {
print("Authorization went wrong: \(error)")
}
}

oauth2.authConfig.authorizeEmbedded = false
oauth2.authorize()
}

// This method gets called by notification and is the last thing we need to do to get our access token.
func handleRedirect(notification: NSNotification) {
oauth2.handleRedirectURL(notification.object as! NSURL)
}

上面的代码应该会把你发送到你可以登录的谷歌网页,然后点击允许。

现在您需要在应用程序委托(delegate)中处理返回到应用程序的问题:

 let OAuth2AppDidReceiveCallbackNotification = "OAuth2AppDidReceiveCallback"

func application(application: UIApplication,
openURL url: NSURL,
sourceApplication: String?,
annotation: AnyObject) -> Bool {
// you should probably first check if this is your URL being opened
NSNotificationCenter.defaultCenter().postNotificationName(OAuth2AppDidReceiveCallbackNotification, object: url)

return true
}

希望这能帮助任何在尝试获取访问 token 时可能遇到问题的人。

关于ios - 在 iOS 上使用 OAuth2 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37187874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com