Cakephp 2.6
opauthを利用して、ログイン状態を保持したいのですのがどよようにすれば良いのでしょうか。
access_tokenを取得して、
Appcontrollerで
access_tokenの有無を判定して、
なければログインページへリダイレクト。
みたいな感じでしょうか。
Sessionとかも使うのでしょうか。
イメージからつかめていません。
教えて頂けますでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
###2016/02/15
opauthを利用して、ログイン状態を保持
opauthは認証機構です。
認証に成功したら、あとはAuthComponentでログイン管理して下さい。
以下opauthのCakePHP用プラグインはすでに実装済みという前提で書きます。
access_token等の認証関連のややこしい部分は全てopauthがやってくれます。
実装の際はcallback用のメソッド内で$this->request->dataを用いて処理していくだけです。
PHP
1// http://lvh.me/auth/○○○(twitterやfacebook等)にアクセス後、認証画面からのコールバック 2public function callback(){ 3 if(empty($this->request->data) || $this->request->data['validated'] === false){ 4 // 認証失敗 5 }else{ 6 // 認証成功 7 $options = array( 'contain' => array() 8 , 'conditions' => array( 'User.provider' => $this->request->data['auth']['provider'] 9 , 'User.uid' => $this->request->data['auth']['uid'])); 10 11 $item = $this->User->find('first', $options); 12 if(empty($item)){ 13 // 未登録アカウント。以下新規登録処理とか。 14 }else{ 15 // 登録済みアカウント。以下ログインさせてマイページへのリダイレクト処理とか。 16 $this->Auth->login($item['User']); 17 } 18 } 19}
Sessionを使うかどうかですが、見ての通り基本は使わなくてOKです。
未登録アカウントは新規登録ページへリダイレクトするような仕様の場合、
provider、uidを持ちまわす為に使うことがあるかもしれません。
###2016/02/16 10:00 追記
PHP
1// http://lvh.me/auth/○○○(twitterやfacebook等)にアクセス後、認証画面からのコールバック 2public function callback(){ 3 if(!is_null($this->Auth->user())){ 4 // すでにログイン済み 5 $this->redirect($this->Auth->loginRedirect); 6 } 7 8 if(empty($this->request->data) || $this->request->data['validated'] === false){ 9 // 認証失敗 10 throw new UnauthorizedException('認証に失敗しました。'); 11 }else{ 12 // 認証成功 13 $options = array( 'contain' => array() 14 , 'conditions' => array( 'User.provider' => $this->request->data['auth']['provider'] 15 , 'User.uid' => $this->request->data['auth']['uid'])); 16 17 // ユーザー情報取得 18 $user = $this->User->find('first', $options); 19 20 if(empty($user)){ 21 // 未登録アカウントの為、新規登録。 22 $save = array( 'User.provider' => $this->request->data['provider'] 23 , 'User.uid' => $this->request->data['uid'] 24 , 'User.username' => $this->request->data['auth']['raw']['name']); 25 if($this->User->save($save)){ 26 // 登録したユーザー情報を再取得 27 $user = $this->User->find('first', $options); 28 }else{ 29 throw new InternalErrorException('新規登録に失敗しました。'); 30 } 31 } 32 33 // ログイン処理 34 if(!empty($user) && $this->Auth->login($user['User'])){ 35 $this->redirect($this->Auth->loginRedirect); 36 }else{ 37 throw new UnauthorizedException('ログインに失敗しました。'); 38 } 39 } 40}
コメントを踏まえて書くとこんな感じでしょうか。
ちなみに$this->request->data['auth']['raw']['name']はプロバイダによって存在しません。
例えばTwitterにはありますが、DropBoxにはありません。
使用されるプロバイダ毎に取得出来るデータをご確認下さい。
投稿2016/02/15 01:13
編集2016/02/16 00:55退会済みユーザー
総合スコア0
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/15 07:47
退会済みユーザー
2016/02/15 08:02 編集
2016/02/15 13:15
退会済みユーザー
2016/02/16 00:01 編集
2016/02/16 04:28