回答編集履歴

4

日付挿入

2016/02/16 00:55

投稿

退会済みユーザー
test CHANGED
@@ -1,3 +1,5 @@
1
+ ###**2016/02/15**
2
+
1
3
  > opauthを利用して、ログイン状態を保持
2
4
 
3
5
 
@@ -74,13 +76,7 @@
74
76
 
75
77
 
76
78
 
77
-
78
-
79
-
80
-
81
- ---
82
-
83
- 2016/02/16 9:30 追記
79
+ ###**2016/02/16 10:00 追記**
84
80
 
85
81
 
86
82
 

3

コメントを受けてコードを追記

2016/02/16 00:55

投稿

退会済みユーザー
test CHANGED
@@ -71,3 +71,109 @@
71
71
  未登録アカウントは新規登録ページへリダイレクトするような仕様の場合、
72
72
 
73
73
  provider、uidを持ちまわす為に使うことがあるかもしれません。
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+ ---
82
+
83
+ 2016/02/16 9:30 追記
84
+
85
+
86
+
87
+ ```PHP
88
+
89
+ // http://lvh.me/auth/○○○(twitterやfacebook等)にアクセス後、認証画面からのコールバック
90
+
91
+ public function callback(){
92
+
93
+ if(!is_null($this->Auth->user())){
94
+
95
+ // すでにログイン済み
96
+
97
+ $this->redirect($this->Auth->loginRedirect);
98
+
99
+ }
100
+
101
+
102
+
103
+ if(empty($this->request->data) || $this->request->data['validated'] === false){
104
+
105
+ // 認証失敗
106
+
107
+ throw new UnauthorizedException('認証に失敗しました。');
108
+
109
+ }else{
110
+
111
+ // 認証成功
112
+
113
+ $options = array( 'contain' => array()
114
+
115
+ , 'conditions' => array( 'User.provider' => $this->request->data['auth']['provider']
116
+
117
+ , 'User.uid' => $this->request->data['auth']['uid']));
118
+
119
+
120
+
121
+ // ユーザー情報取得
122
+
123
+ $user = $this->User->find('first', $options);
124
+
125
+
126
+
127
+ if(empty($user)){
128
+
129
+ // 未登録アカウントの為、新規登録。
130
+
131
+ $save = array( 'User.provider' => $this->request->data['provider']
132
+
133
+ , 'User.uid' => $this->request->data['uid']
134
+
135
+ , 'User.username' => $this->request->data['auth']['raw']['name']);
136
+
137
+ if($this->User->save($save)){
138
+
139
+ // 登録したユーザー情報を再取得
140
+
141
+ $user = $this->User->find('first', $options);
142
+
143
+ }else{
144
+
145
+ throw new InternalErrorException('新規登録に失敗しました。');
146
+
147
+ }
148
+
149
+ }
150
+
151
+
152
+
153
+ // ログイン処理
154
+
155
+ if(!empty($user) && $this->Auth->login($user['User'])){
156
+
157
+ $this->redirect($this->Auth->loginRedirect);
158
+
159
+ }else{
160
+
161
+ throw new UnauthorizedException('ログインに失敗しました。');
162
+
163
+ }
164
+
165
+ }
166
+
167
+ }
168
+
169
+ ```
170
+
171
+
172
+
173
+ コメントを踏まえて書くとこんな感じでしょうか。
174
+
175
+ ちなみに$this->request->data['auth']['raw']['name']はプロバイダによって存在しません。
176
+
177
+ 例えばTwitterにはありますが、DropBoxにはありません。
178
+
179
+ 使用されるプロバイダ毎に取得出来るデータをご確認下さい。

2

推敲

2016/02/16 00:48

投稿

退会済みユーザー
test CHANGED
@@ -34,7 +34,7 @@
34
34
 
35
35
  }else{
36
36
 
37
- // 認証成功、ログインさせる
37
+ // 認証成功
38
38
 
39
39
  $options = array( 'contain' => array()
40
40
 

1

推敲

2016/02/15 01:22

投稿

退会済みユーザー
test CHANGED
@@ -46,15 +46,15 @@
46
46
 
47
47
  $item = $this->User->find('first', $options);
48
48
 
49
- $isLogin = $this->Auth->login($item['User']);
49
+ if(empty($item)){
50
50
 
51
- if($isLogin){
52
-
53
- // 登録済みアカウント。以下マイページへのリダイレクト処理とか。
51
+ // 登録アカウント。以下新規登録処理とか。
54
52
 
55
53
  }else{
56
54
 
57
- // 登録アカウント。以下新規登録処理とか。
55
+ // 登録済みアカウント。以下ログインさせてマイページへのリダイレクト処理とか。
56
+
57
+ $this->Auth->login($item['User']);
58
58
 
59
59
  }
60
60