HexavilleAuth

HexavilleAuth 是一个用于 Hexaville 的身份验证(OAuth,基于简单密码)框架。

HexavilleAuth 认识到每个应用程序都有独特的身份验证需求。它允许将单独的身份验证机制打包为插件,并由其使用。

插件的范围可以从简单的基于密码的身份验证,到使用 OAuth 的身份验证(通过 Facebook、Github OAuth 提供商等)。

HexavilleAuth 为每个 SNS 平台自动创建授权/回调资源,因此您可以非常快速地将 SNS 身份验证功能嵌入到您的 Hexaville 应用程序中。

身份验证方法

授权方法

支持的 SNS 平台

OAuth2

OAuth1

安装

只需将 .Package(url: "https://github.com/Hexaville/HexavilleAuth.git", majorVersion: 0, minor: 1) 添加到您的 Package.swift 中

import PackageDescription

let package = Package(
    name: "MyHexavilleApplication",
    dependencies: [
        .Package(url: "https://github.com/Hexaville/HexavilleAuth.git", majorVersion: 0, minor: 1)
    ]
)

用法

这是一个使用 HexavilleFramework 进行 Facebook OAuth 授权的示例代码

import Foundation
import HexavilleAuth
import HexavilleFramework

let app = HexavilleFramework()

var auth = HexavilleAuth()

let APP_URL = ProcessInfo.processInfo.environment["APP_URL"] ?? "https://:3000"

let facebookProvider = FacebookAuthorizationProvider(
    path: "/auth/facebook",
    consumerKey: ProcessInfo.processInfo.environment["FACEBOOK_APP_ID"] ?? "",
    consumerSecret: ProcessInfo.processInfo.environment["FACEBOOK_APP_SECRET"] ?? "",
    callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/facebook/callback"),
    scope: "public_profile"
) { credential, user, request, context in

    // here is called when the access_token got successfully from sns.

    return Response(body: "\(user)")
}

auth.add(facebookProvider)

app.use(auth)

app.catch { error in
    switch error {
    case HexavilleAuthError.responseError(let response):
        return Response(body: response.body.asData())
    default:
        return Response(body: "\(error)")
    }
}

try app.run()

在每个请求中获取 loginUser 对象。

如果您注册了 HexavilleAuth.AuthenticationMiddleware 并且 loginUser 信息存储在会话中,则可以从 ApplicationContext 中以 LoginUser 对象的形式获取它。

LoginUser

public struct LoginUser {
    public let id: String
    public let name: String
    public let screenName: String?
    public let email: String?
    public let picture: String?
    public let raw: [String: Any]
}

示例

import Foundation
import HexavilleAuth
import HexavilleFramework

let app = HexavilleFramework()

var auth = HexavilleAuth()

let APP_URL = ProcessInfo.processInfo.environment["APP_URL"] ?? "https://:3000"

let twitterProvider = TwitterAuthorizationProvider(
    path: "/auth/twitter",
    consumerKey: ProcessInfo.processInfo.environment["TWITTER_APP_ID"] ?? "",
    consumerSecret: ProcessInfo.processInfo.environment["TWITTER_APP_SECRET"] ?? "",
    callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/twitter/callback"),
    scope: ""
) { credential, user, request, context in
    return Response(body: "\(user)")
}

app.use(HexavilleAuth.AuthenticationMiddleware()) // register to get loginUser Object

app.use { req, context in
  print(context.isAuthenticated()) // => true
  print(context.loginUser) // Get the loginUser object
  return .next(req)
}

auth.add(twitterProvider)

app.use(auth)

try app.run()

尝试示例!

这是一个官方完整示例代码.

安装并构建示例

git clone https://github.com/Hexaville/HexavilleAuth.git
cd HexavilleAuth
cd swift build

启动服务器

./.build/debug/HexavilleAuthExample

# => Hexaville Builtin Server started at 0.0.0.0:3000

资源

尝试访问以下资源,以使用浏览器进行身份验证/授权!

创建您自定义的授权/身份验证提供程序

您可以使用 OAuthXAuthorizationProvidable/ AuthenticationProvidable 创建自定义的授权/身份验证提供程序

Oauth2

OAuth2Authorization

public protocol OAuth2AuthorizationProvidable {
    var path: String { get } // path for authorize
    var oauth: OAuth2 { get }
    var callback: RespodWithCredential { get }  // callback for success handler
    init(path: String, consumerKey: String, consumerSecret: String, callbackURL: CallbackURL, scope: String, callback: @escaping RespodWithCredential)
    func getAccessToken(request: Request) throws -> Credential
}

这是一个 Salesforce 授权的示例。

public struct SalesforceAuthorizationProvider: OAuth2AuthorizationProvidable {

    public let path: String

    public let oauth: OAuth2

    public let callback: RespodWithCredential

    public init(path: String, consumerKey: String, consumerSecret: String, callbackURL: CallbackURL, scope: String, callback: @escaping RespodWithCredential) {
        self.path = path

        self.oauth = OAuth2(
            consumerKey: consumerKey,
            consumerSecret: consumerSecret,
            authorizeURL: "https://login.salesforce.com/services/oauth2/authorize",
            accessTokenURL: "https://login.salesforce.com/services/oauth2/token",
            callbackURL: callbackURL,
            scope: scope
        )

        self.callback = callback
    }
}

使用它!

var auth = HexavilleAuth()

let salesforceProvider = SalesforceAuthorizationProvider(
    path: "/auth/salesforce",
    consumerKey: "consumer",
    consumerSecret: "secret",
    callbackURL: CallbackURL(baseURL: APP_URL, path: "/auth/salesforce/callback"),
    scope: "public_profile"
) { credential, user, request, context in

    try DB.save(token: credential.accessToken)

    return Response(body: "\(user)")
}

auth.add(salesforceProvider)

许可证

HexavilleAuth 在 MIT 许可证下发布。有关详细信息,请参阅 LICENSE。