我有一个iOS客户端,使用OAuth 2.0作为身份验证机制.

当用户登录时,我使用此方法对其进行身份验证(例如,Google登录):

 func processGoogleLogin(request: Request, token: String) throws -> EventLoopFuture<ResponseEncodable> {
    try Google
        .getUser(on: request)
        .flatMap { userInfo in
            User
                .query(on: request.db)
                .filter(\.$email == userInfo.email)
                .first()
                .flatMap { foundUser in
                    guard let existingUser = foundUser else {
                        //creating a new user
                        return user
                            .save(on: request.db)
                            .map {
                                request.session.authenticate(user)
                                //redirecting with info
                            }
                    }
                    request.session.authenticate(existingUser)
                    //redirecting with info
                }
        }
}

登录后,我想判断用户是否通过了身份验证,以及我是否成功地对用户进行了身份验证. 因此,我有一个针对未经身份验证的用户保护的终结点,但即使在登录之后,该用户也无法访问此终结点,因为他未经过身份验证.


Error:
{
"error": true,
"reason": "User not authenticated."
}

My User Model conforms to ModelSessionAuthenticatable.

我还使用SessionMiddleware(ImpreialController是身份验证控制器):

   let imperialController = ImperialController(sessionsMiddleware: app.sessions.middleware)
   app.middleware.use(app.sessions.middleware)

In ImperialController:
class ImperialController {
    private let sessionsMiddleware: Middleware
    
    init(sessionsMiddleware: Middleware) {
        self.sessionsMiddleware = sessionsMiddleware
    }
    ....

And finally the protected route:
let protected = app.grouped(User.guardMiddleware())

protected.get { req -> HTTPResponseStatus in
    return .ok
}

推荐答案

可能是你在做这件事,只是没有在你的问题中表现出来.您需要使用如下内容创建并注册一个SessionsMiddleware的实例:

app.middleware.use(SessionsMiddleware(session: MemorySessions(storage: MemorySessions.Storage())))

在创建控制器的实例之前执行此操作.

编辑回复 comments : 我通常显式地传递不同中间件的实例,因为我倾向于将子集应用于路由组,而不是所有中间件.例如:

    app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
    app.middleware.use(SessionsMiddleware(session: MemorySessions(storage: MemorySessions.Storage())))
    app.middleware.use(User.sessionAuthenticator(.mysql))

    try app.register(collection: APIController(middleware: UserToken.authenticator()))

    var middleware: [Middleware] = [CustomMiddleware.InternalErrorMiddleware()]
    try app.register(collection: InsecureController(middleware: middleware))

    middleware.append(contentsOf: [User.redirectMiddleware(path: [C.URI.Solidus].string),
                                   User.authenticator(), User.guardMiddleware(),
                                   CustomMiddleware.SessionTimeoutMiddleware()])
    try app.register(collection: CustomerController(middleware: middleware))

顺便说一句,你有没有把我上面的第三行也包括进go ?这可能是你的问题.

Swift相关问答推荐

如何消除SwiftUI中SF符号的填充

如何使用Swift宏向 struct 体及其init函数添加新成员?

如何让ScrollView缩小到合适的大小,并在没有黑客攻击的情况下占用最小空间

如何使用可搜索在搜索栏中搜索包括>或<?

ClosedRange.Swift 中 Int 的索引?

如何在设备(或常量)地址空间中创建缓冲区?

Swift UI中视图上的值未更新

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

有没有更快的方法来循环浏览 macOS 上已安装的应用程序?

为什么 id 不能通过 struct 从 Objective-C 移植到 Swift?

动画偏移正在 destruct 按钮 SwiftUI

如何在 SwiftUI 中将图像传递到 2 个视图

符合协议 - 错误?

对齐时如何避免图像尺寸缩小

使 Swift 并发中的任务串行运行

Xcode 7.3 Swift 的语法高亮和代码完成问题

subscribeOn 和 observeOn 的顺序重要吗?

如何在Swift中找出字母是字母数字还是数字

如何使用 swift 在 tableview 中填充两个不同数组的两个部分?

使用 swift IOS 使 UIBarButtonItem 消失