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

2023-11-30

我目前正在尝试使用 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()

当我运行这个程序时,它会在浏览器中加载谷歌,我就可以登录。然后它会询问我在范围内声明的权限,效果很好。我单击“确定打开”,它会将我重定向回我的应用程序。

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

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

我想知道是否有人可以帮助我弄清楚为什么它没有在钥匙串中保存任何内容。这是否也意味着用户没有真正经过身份验证?

Thanks.

===

Edit

已添加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

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

=====

Edit 2

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


在帕斯卡的帮助下:https://github.com/p2/OAuth2/issues/109我已经成功让它发挥作用了。事实证明,我没有按照我应该执行的步骤:“3 授权用户”。

所以完整的解决方案是:

在我的视图控制器中,我有以下内容:

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)
}

上面的代码应该将您发送到谷歌网页,您可以在其中登录,然后单击允许。

现在您需要在应用程序委托中处理返回应用程序:

 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
}

希望这能帮助其他可能在尝试获取访问令牌时遇到问题的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iOS 上使用 OAuth2 进行身份验证 的相关文章

  • 无法连接到 iTunes Store(获取应用内购买列表)

    我正在尝试从我的应用程序的应用程序内购买项目商店中获取列表 这是我所做的 安装了新的配置文件并启用了应用内购买 替换配置文件很棘手 但我认为我的设置是正确的 验证税务和银行信息是否正常 该应用程序已在商店出售 创建测试用户 在测试设备上以测
  • Swift 协议扩展实现另一个具有共享关联类型的协议

    考虑以下 protocol Foo typealias A func hello gt A protocol FooBar Foo func hi gt A extension FooBar func hello gt A return h
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • 有关 Swift 编译器选项的文档

    您好 我想开始在 Apple Swift 语言上运行一些微基准测试 然而 我觉得很难找到有关编译器优化的不同选项的适当文档 我读过很多关于其他人的语言微基准的问题和文章 但是如果能有一些关于该主题的可靠文档那就太好了 在最新的测试版中 使用
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • 使用 Python Oauthlib 通过服务帐户验证 Google API

    我不想使用适用于 Python 的 Google API 客户端库 但仍想使用 Python 访问 Google APIOauthlib https github com idan oauthlib 创建服务帐户后谷歌开发者控制台 http
  • 如何解决 Xcode 5 中的红色(已移动)文件?

    在 Xcode 4 中 当您要移动文件时 可以通过单击右侧菜单中的按钮并通过 Finder 选择新位置来解析文件的新位置 在 Xcode 5 中 右侧菜单中没有按钮 我还没有找到任何方法通过右键单击文件或顶部菜单栏选项来指定文件的新位置 在
  • 当直接从 usdz 文件而不是 Reality Composer 文件加载模型时,如何在 RealityKit 中渲染阴影?

    将模型直接从 usdz 文件添加到场景锚点时 模型下方不会出现接地阴影 如果您将模型导入 RealityComposer 并添加 RealityComposer 场景 则会出现这些 但是 您可以在不使用 RC 的情况下启用接地阴影吗 我尝试
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent
  • 如何更改 SwiftUI 列表中分隔符的颜色?

    我在 SwiftUI 中创建了一个列表 我想更改颜色或删除分隔符 因为在 UIKit 中 我们可以轻松更改 TableView 中分隔符的颜色 下面是 SwiftUI 中列表的代码和 UI 图片 State private var user
  • SpriteKit的更新函数:时间与帧率

    一般来说 我对编程和 Spritekit 很陌生 并且有兴趣探索毫秒和帧率之间的关系 以及如何使用更新函数作为两者之间的中介 帧率与毫秒 从本质上讲 帧速率和时间之间的主要区别在于时间始终一致 而帧速率则不然 由于密集的图形程序 它可能会下
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do

随机推荐

  • 将具有相同 ID 类和标签 HTML 的多个元素拖放到屏幕上的任意位置

    大家好 这是我的第一个问题 所以我可能做错了 我想要实现的是拥有多个
  • 实现 PostgreSQL 表的历史记录

    我想实现 PostgreSQL 表的更改历史记录 该表的定义方式如下 CREATE TABLE ps counters psid integer NOT NULL counter bigint NOT NULL 我希望历史表看起来像 CRE
  • 读取刚刚写入临时文件的数据[重复]

    这个问题在这里已经有答案了 在 Go 中 我尝试将数据写入临时文件 然后转身读取该文件 但没有成功 下面是一个精简的测试程序 我已通过检查临时文件验证数据是否已写入文件 所以 至少我知道数据正在进入文件 我只是无法读出它 提前谢谢你的帮助
  • TMDb API 调用 - Swift

    我正在打电话TMDb Api按类型获取一系列电影 我想访问的许多属性都返回 nil 例如 vote count poster path 和 vote average 如果我在浏览器中调用 api 我会按预期获得所有属性 这是我的模型 imp
  • 如何使用 android 中的 zxing 库从相机预览中解码条形码?

    我想在我的 android 应用程序中实现独立的扫描仪 我在我的项目中使用 zxing 的 core jar 库 我需要从相机预览中解码条形码 但我不知道如何实现它 因为没有官方文档 您能为我提供一个有关以下事项的简单示例吗 1 初始化相机
  • Paypal 错误:文件系统检查失败

    我知道 SO 上有两篇关于此错误的帖子 就像我发现的每个谷歌结果一样 解决方案是 不要使用越狱设备 但我的很干净 我的客户也是如此 我用 Paypal 开发了两个应用程序 第一个效果非常好 第二个在 Paypal 按钮初始化时在调试器中显示
  • 如何使用多个 OR 语句根据对象的属性过滤数组

    这个问题很难用语言表达 但这是我的情况 我在一个名为的数组中有几个 Monster 对象monsters 每个怪物都有一个name属性是一个字符串 我有第二个数组称为monsterNames 其中包含几个怪物名称 作为字符串 我希望能够过滤
  • 如何避免 Angular 2 在链接中添加前缀“unsafe”? [复制]

    这个问题在这里已经有答案了 使用Angular 2 是否有一个设置可以避免添加前缀 unsafe 到链接 我需要为 Angular 2 中默认未列入白名单的协议设置链接 但我们的内部应用程序需要它 因此结果是无效链接 a href a pl
  • 带有文本和图像的 Android 按钮

    在看到有关此功能的许多问题并尝试遵循答案后 我想知道是否有更清晰的示例 编辑 我试图制作一个大按钮 其中的图像和文本位于 中间 它必须表现为一个按钮 StateList 可绘制 并且图像 文本对应该分组并居中 作为一个组 如果您喜欢带有图像
  • 如何在 ASP.Net MVC2 中完成这种类型的 URL?

    我有一个名为 类别 的表 我希望用户从类别列表中单击 然后加载该类别中所有拍卖的列表 很简单 对吧 我可以为每个类别创建一个操作 例如 public ActionResult Cellphones public ActionResult E
  • 为什么这些记录没有存储在缓存中?

    我想在收到记录后对其进行缓存 但我不知道如何进行 根据文档 您只需调用this store push model record 但似乎不起作用 Ember 在每次调用路由时都会从服务器请求数据 我只想执行一次 并在从服务器获取数据后使用本地
  • Google Sheet:如何使用 arrayformula 将数据从一张纸复制到另一张纸?

    在Google电子表格中 我想将sheet1中的A2 G500同步到sheet2 我知道以下两种方法 use IMPORTRANGE 在sheet2的A1中输入以下公式 导入范围 电子表格网址 表1 A2 G500 它有效 但感觉我做得太过
  • 添加不存在的订单元数据以扩展 WooCommerce 管理订单搜索

    继我之前的问题之后 我还有一个问题 允许在 WooCommerce 管理订单列表中使用帐单电子邮件进行搜索 以下是我的代码 用于将电子邮件和电子邮件显示为 md5 电话号码和支付网关名称 add filter manage edit sho
  • 将循环的结果分配给Python中的变量[重复]

    这个问题在这里已经有答案了 考虑一个我想使用解析的列表for friends Joe Zoe Brad Angelina Zuki Thandi Paris for i in friends print i 将返回 Joe Zoe Brad
  • 不使用扫描验证 DynamoDB 中的属性?

    如何在不使用 dynamodb 中的 scan 的情况下验证属性是否存在于表中 在我的用例中 从客户端 客户请求其 Customer id 以了解产品的价值 在服务器端 必须检查输入的 customer id 是否已存在于 DynamoDB
  • Google 登录在尝试调用 canOpenURL 时在 iOS 9 上崩溃

    在 iOS 9 SDK 上测试 Google Sign In 2 1 0 时 调用GIDSignIn sharedInstance signInSilently 最终在内部 Google Sign In SDK 调用时崩溃canOpenUR
  • 如何在Python脚本中导入lldb

    根据 LLDB 主页 LLDB 可以在 python 脚本中导入 如下所示 import lldb 从发行包安装 GDB 后 在 Ubuntu 15 04 上 sudo apt get install lldb 出现以下错误 Traceba
  • 拆分数据库行中的字符串并将结果复制到不同的行 - SQL Server

    我创建了一个向用户发送邮件的应用程序 我正在使用一个数据库 其中一些用户分配了多个电子邮件地址 Name Mail BusinessXPTO email protected email protected 电子邮件列可以包含多个电子邮件 以
  • javascript document.anchors.length 在 Firefox 中返回 1

    我正在尝试使用 javascript 运行页面中 6 个锚点的列表 对它们进行一些操作 然而 循环没有被执行 因为anchors length返回1 以下是我的代码片段
  • 在 iOS 上使用 OAuth2 进行身份验证

    我目前正在尝试使用 OAuth2 授权我的用户 我目前正在使用以下库 https github com p2 OAuth2 let oauth2 OAuth2CodeGrant settings client id my id author