Help us understand the problem. What is going on with this article?

Swiftでログイン機能をつけてみよう!

More than 3 years have passed since last update.

【お知らせ】Swift3に対応しました!(2017/02/24更新)

【Swift×mBaaS】シリーズ概要

事前準備のお願い

会員管理について

認証の種類

  • 会員の認証方法は4つあります。
    • ユーザー名とパスワードによる認証
    • メールアドレスとパスワードによる認証
    • 匿名認証
    • SNSアカウント(Facebook/Twitter/Google)での認証
  • ここでは上3つを扱います。
  • 「SNSアカウントでの認証」については下記<SNS連携編>をご覧ください。

ダッシュボードでの事前設定

ここで扱う3つの認証方法

  • ユーザー名とパスワードによる認証
  • メールアドレスとパスワードによる認証
  • 匿名認証

は、いずれにおいても認証を許可する設定を、ニフティクラウドmobile backendのダッシュボード上で行わなければなりません。

ニフティクラウドmobile backendにログインして、ブラウザでダッシュボードを開いてください。

  • ユーザー名とパスワードによる認証とメールアドレスとパスワードによる認証はアプリ設定会員認証設定に設定項目があります。
  • 匿名認証はアプリ設定基本の画面の下のほうに設定項目があります。

図2.png

  • コードを実行する前に「許可する」に設定をして「保存する」ボタンで必ず保存をしおいてください。

Swiftでログイン機能をつけてみよう!

ユーザー名・パスワード認証

ユーザーの新規登録

NCMBUserオブジェクト作成後、signUpInBackgroundWithBlockメソッドで登録処理を行います

Swift3
//NCMBUserのインスタンスを作成
let user = NCMBUser()
//ユーザー名を設定
user.userName = "user1"
//パスワードを設定
user.password = "password1"
//会員の登録を行う
user.signUpInBackground { (error) in
    if error != nil {
        // 新規登録失敗時の処理
    }else{
        // 新規登録成功時の処理
    }
}
Swift2
//NCMBUserのインスタンスを作成
let user = NCMBUser()
//ユーザー名を設定
user.userName = "user1"
//パスワードを設定
user.password = "password1"
//会員の登録を行う
user.signUpInBackgroundWithBlock{(error: NSError!) in
    if error != nil {
        // 新規登録失敗時の処理
    }else{
        // 新規登録成功時の処理
    }
}

ログイン

logInWithUsernameInBackgroundメソッドに新規登録時に設定したユーザ名とパスワードを指定してログインします

Swift3
// ユーザー名とパスワードでログイン
NCMBUser.logInWithUsername(inBackground: "user1", password: "password1") { (user, error) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
}
Swift2
// ユーザー名とパスワードでログイン
NCMBUser.logInWithUsernameInBackground("user1", password: "password1", block:{(user: NCMBUser!, error: NSError!) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
})
  • ログインをすると「セッショントークン」というものが発行されます。これによって特定のユーザーの権限でオブジェクトにアクセスできるようになります。

ログアウト

logOutメソッドを利用します。

Swift_共通
// ログアウト
NCMBUser.logOut()
  • ログアウトすることでセッショントークンは無効になります。
  • セッショントークンはログアウトしなくてもデフォルトで24時間たつと無効になります。有効期限の変更は先程のダッシュボードで行えます。

ログイン中のユーザーの取得

currentUserメソッドで、現在ログイン中のユーザー(カレントユーザー)情報を取得することができます。

Swift3
let carrentUser = NCMBUser.current()
Swift2
let carrentUser = NCMBUser.currentUser()

メールアドレス・パスワード認証

メールアドレス認証は、

  1. 利用者がメールアドレスを入力して認証をリクエストする
  2. 入力したメールアドレスに対して会員登録画面へのURLを含むメールが送信される
  3. メールから会員登録画面を開き、パスワードを入力して会員登録を行う
  4. メールアドレスとパスワードでのログインが可能になる

という流れになっています。
※ 2.の送信元メールアドレスや、メール本文の内容は先程のダッシュボードで設定ができます。

会員登録用のメールを要求する

requestAuthenticationMailメソッドを実行すると、メールアドレスでの会員登録を行うためのメールが送信されます。

Swift3
NCMBUser.requestAuthenticationMail("test@sample.com", error: nil)
Swift2
var error : NSError? = nil
NCMBUser.requestAuthenticationMail("test@sample.com", error: &error)
  • "test@sample.com"の部分をお持ちのメールアドレスに書き換えて試してみてください!

ログイン

logInWithMailAddressInBackgroundメソッドに、登録時に設定したメールアドレスとパスワードを指定してログインします。

Swift3
// メールアドレスとパスワードでログイン
NCMBUser.logInWithMailAddress(inBackground: "test@sample.com", password: "password2", block: { (user, error) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
})
Swift2
// メールアドレスとパスワードでログイン
NCMBUser.logInWithMailAddressInBackground("test@sample.com", password: "password2", block:{(user: NCMBUser!, error: NSError!) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
})
  • ログアウトはユーザー名・パスワード認証と同様です。

匿名認証

ユーザー名・パスワードを入力せずに会員登録をすることができます。ただし、一度ログアウトをすると、次にログインする場合は別のユーザーとして登録されてしまうので、仮ユーザーとして利用する用途で使います。

ログイン

NCMBAnonymousUtilsクラスを利用して、匿名ユーザーでログインします。

Swift3
// 匿名ユーザーでログイン
NCMBAnonymousUtils.logIn { (user, error) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
}
Swift2
// 匿名ユーザーでログイン
NCMBAnonymousUtils.logInWithBlock{(user: NCMBUser!, error: NSError!) in
    if error != nil {
        // ログイン失敗時の処理
    }else{
        // ログイン成功時の処理
    }
}

ログイン中の匿名ユーザーの取得

isLinkedWithUserメソッドで匿名ユーザーでログインしているか確認できます。

Swift3
if NCMBAnonymousUtils.isLinked(with: NCMBUser.current()) {
    // 匿名ユーザーでログインしている時の処理
}else{
    // 匿名ユーザーでログインしていない時の処理
}
Swift2
if NCMBAnonymousUtils.isLinkedWithUser(NCMBUser.currentUser()) {
    // 匿名ユーザーでログインしている時の処理
}else{
    // 匿名ユーザーでログインしていない時の処理
}

会員のグルーピング(ロール)

ロールは、会員をグルーピングするための機能です。

ロールの作成

NCMBRoleクラスを利用します。

Swift3
// ロールの作成
let basicPlanRole = NCMBRole(name: "basicPlan")
basicPlanRole?.saveInBackground(nil)
let expertPlanRole = NCMBRole(name: "expertPlan")
expertPlanRole?.saveInBackground(nil)
Swift2
// ロールの作成
let basicPlanRole = NCMBRole(name: "basicPlan")
basicPlanRole.saveInBackgroundWithBlock(nil)
let expertPlanRole = NCMBRole(name: "expertPlan")
expertPlanRole.saveInBackgroundWithBlock(nil)

会員をロールに追加する

addUserメソッドを利用します。

Swift3
// ロールに追加するユーザーを作成
let user = NCMBUser()
user.userName = "basicPlanUser"
user.password = "password"
user.signUpInBackground { (error) in
    if error != nil {
        // ユーザー作成失敗時の処理

    }else{
        // ユーザー作成成功時の処理
        // 既存ロールの"basicPlan"を検索
        let query = NCMBRole.query()
        query?.whereKey("roleName", equalTo: "basicPlan")
        query?.findObjectsInBackground({ (objects, error) in
            if error != nil {
                // 検索失敗時の処理
            }else{
                // 検索成功時の処理
                // 検索結果をロールに設定してユーザーを追加
                let role = objects?[0] as! NCMBRole
                role.add(user)
                role.saveInBackground({ (error) in
                    if error != nil {
                        // ユーザー追加失敗時の処理
                    }else{
                        // ユーザー追加成功時の処理
                    }
                })
            }
        })
    }
}
Swift2
// ロールに追加するユーザーを作成
let user = NCMBUser()
user.userName = "basicPlanUser"
user.password = "password"
user.signUpInBackgroundWithBlock{(error: NSError!) in
    if error != nil {
        // ユーザー作成失敗時の処理
    }else{
        // ユーザー作成成功時の処理
        // 既存ロールの"basicPlan"を検索
        let query = NCMBRole.query()
        query.whereKey("roleName", equalTo: "basicPlan")
        query.findObjectsInBackgroundWithBlock {(objects: [AnyObject]!, error: NSError!) -> Void in
            if error != nil {
                // 検索失敗時の処理
            }else{
                // 検索成功時の処理
                // 検索結果をロールに設定してユーザーを追加
                let role = objects.first
                role!.addUser(user)
                role!.saveInBackgroundWithBlock{(error: NSError!) -> Void in
                    if error != nil {
                        // ユーザー追加失敗時の処理
                    }else{
                        // ユーザー追加成功時の処理
                    }
                }
            }
        }
    }
}

子ロールの追加

  • ロールの中にロールを作成します。

親ロールの中に子ロールを作成するには、addRoleメソッドを利用します。

Swift3
// 子ロール
let childRole = NCMBRole(name: "childRole")
childRole?.save(nil)
let role = NCMBRole(name: "Role")
role?.add(childRole)
role?.save(nil)
Swift2
// 子ロール
let childRole = NCMBRole(name: "childRole")
childRole.save(nil)
let role = NCMBRole(name: "Role")
role.addRole(childRole)
role.save(nil)
natsumo
ニフクラ mobile backend の使い方をまとめています。
https://github.com/natsumo/
fjct
クラウド・IoT 関連サービスを開発・提供している企業です。(こちらは、富士通クラウドテクノロジーズの有志にて運営しております。)
https://fjct.fujitsu.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした