【问题标题】:Swift OAuth2.0 with redirectURI带有redirectURI的Swift OAuth2.0
【发布时间】:2021-02-27 23:33:39
【问题描述】:

我正在使用提供 OAuth2.0 身份验证的服务。这是我需要的步骤:

  • 打开一个以用户 ID 作为参数的 URL
  • 用户批准我的应用(已正确注册)。
  • 用户被重定向到一个 RedirectUri,在哈希中带有访问令牌。

第三点是我的主要问题。

我已经使用微软库实现了 OAuth,一切正常。但我不能在这里使用它们,所以我正在尝试https://github.com/OAuthSwift/OAuthSwift 这个。

这是我的代码:

private func authenticationService() {
    // create an instance and retain it
    let oauthswift = OAuth2Swift(
        consumerKey:    "xx",
        consumerSecret: "xxx",
        authorizeUrl:   "//myurl + userId",
        responseType:   "token"
    )

    oauthswift.authorizeURLHandler = OAuthSwiftOpenURLExternally.sharedInstance

    let handle = oauthswift.authorize(
        withCallbackURL: "???",
        scope: "", state:"") { result in
        switch result {
        case .success(let (credential, response, parameters)):
          print(credential.oauthToken)
          // Do your request
        case .failure(let error):
          print(error.localizedDescription)
        }
    }
}

这会正确打开我的 Safari,但随后我被重定向到带有哈希中访问令牌的 URI,但什么也没发生。

这里的主要问题是我有一个重定向 uri,所以我猜回调 URL 没有被调用?这不是打开工作表,而是重定向到 Safari。而且我不喜欢这种方法。

如何通过上述步骤快速执行 OAuth2.0?如何从 url 获取访问令牌?什么是最好的图书馆,我怎样才能充分利用它?


更新:

这是我的 stackExchange 代码:

    let request: OAuth2Request = .init(authUrl: "https://stackexchange.com/oauth/dialog?client_id=<MYCLIENTID>&scope=private_info&redirect_uri=https://stackexchange.com/oauth/login_success",
                                   tokenUrl: "https://stackoverflow.com/oauth/access_token/json",
                                   clientId: "<MYCLIENTID>",
                                   redirectUri: "https://stackexchange.com/oauth/login_success",
                                   clientSecret: "",
                                   scopes: [])

堆栈应用程序中的 OAuth 域是 => stackexchange.com 所以我在我的 URL 类型中添加了以下内容:redirect-uri://(即使没有 )

但是每次我批准我的应用程序时,我都会被堆叠在包含我的令牌的“授权应用程序”中,并且我没有被重定向。

【问题讨论】:

  • 这是个好问题,我要链接一个新的库看看 =>
  • 从这个好教程中试试这个!

标签: ios swift oauth swiftui token


【解决方案1】:

如果您的目标是 iOS 13,您可以使用 Apple 提供的新 AuthenticationServices 库。

它适用于 macOS 和 iOS。

也许这会对其他开发者有所帮助,我创建了一个简单而小的 swift 包来处理 Swift 中的 OAuth2,您可以查看演示项目,它运行良好?

https://github.com/hadiidbouk/SimpleOAuth2

编辑:

你传递了错误的 URL,它们应该是这样的

let request: OAuth2Request = .init(authUrl: "https://stackoverflow.com/oauth",
                                       tokenUrl: "https://stackoverflow.com/oauth/access_token/json",
                                       clientId: "<<your client id>>",
                                       redirectUri: "redirect-uri://stackexchange.com",
                                       clientSecret: "<<your client secret>>",
                                       scopes: ["private_info"])

【讨论】:

  • 这太有趣了,我正在尝试这个。我正在尝试使用 StackExchange 实现 OAuth,但我真的不知道该怎么做。我正在添加所需的所有信息,但是一旦“授权”页面提示并单击它,我就会被重定向到一个新页面,并且我无法关闭“身份验证表”以获取令牌。你试过 StackExchange 吗?我真的很感激任何帮助
  • 我只尝试了 GitLab,将尝试 StackExchange 并回复您??
  • 它正在工作,你可以使用 1.0.4 版本的包,我将 OAuth2Credentials 结构更改为 RFC 6749 OAuth 2.0 tools.ietf.org/html/rfc6749#section- 中定义的结构5.1。 StackExchange 正在返回“expires”,但推荐的是“expires_in”,所以我在新版本中处理这个问题。 PS:对于重定向,您需要在 target>info>URL Types 中注册您的方案。像“redirect-uri://>”之类的东西会起作用。告诉我它现在是否适合你,如果我需要编辑库,我总是可以修改,因为我在我的应用程序中使用它
  • 另外不要忘记使用访问令牌响应“stackoverflow.com/oauth/access_token/json”的JSON格式
  • 你真好。我真的很感谢你的帮助,并分享了你的图书馆。但我仍然面临这个问题,我用所有细节更新了我的答案。您尝试过 StackExchange Oauth 对吗?我在工作吗?我的更新和你的代码有什么不同吗?
【解决方案2】:

在下面的代码中:

private func authenticationService() {
    // create an instance and retain it
    let oauthswift = OAuth2Swift(...)

你没有保留oauthswift(也没有handle)。一旦你完成authenticationService 函数的执行,它们就会被释放。

您需要在函数外部(在类级别)存储对oauthswifthandle 的引用。

let oauthswift: OAuth2Swift
let handle: ...

init() {
    oauthswift = OAuth2Swift(
        consumerKey:    "xx",
        consumerSecret: "xxx",
        authorizeUrl:   "//myurl + userId",
        responseType:   "token"
    )
    ...
}

private func authenticationService() {
    handle = oauthswift.authorize(...)
}

【讨论】:

  • 这是一个好点,我没有注意到。但这就是发生的事情 => 我点击我的按钮 => 重定向到 Safari => 我登录并重定向到带有哈希访问代码的页面。但是我的代码没有发生任何事情,safari 没有被解雇,用户体验不好,我没有令牌。在“withCallBackURL 我添加我的 bundleIdentifier + :/oauth2Callback
  • 我在 authorizeUrl 中有我的重定向 uri,当我被重定向时,我在这个 url 中有 accessToken
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 2021-10-06
  • 2015-09-14
  • 2018-12-02
  • 1970-01-01
  • 2018-12-22
  • 2017-11-11
相关资源
最近更新 更多