1
+ defmodule CoherenceAssent.Strategy.VK do
2
+ @ moduledoc """
3
+ VK.com OAuth 2.0 strategy.
4
+ """
5
+
6
+ alias CoherenceAssent.Strategy.Helpers
7
+ alias CoherenceAssent.Strategies.OAuth2 , as: OAuth2Helper
8
+
9
+ def authorize_url ( conn , config ) do
10
+ OAuth2Helper . authorize_url ( conn , set_config ( config ) )
11
+ end
12
+
13
+ def callback ( conn , config , params ) do
14
+ config = set_config ( config )
15
+ client = OAuth2.Client . new ( config )
16
+
17
+ conn
18
+ |> OAuth2Helper . check_conn ( client , params )
19
+ |> OAuth2Helper . get_access_token ( config , params )
20
+ |> get_user ( config )
21
+ |> get_response ( )
22
+ |> normalize ( )
23
+ end
24
+
25
+ defp set_config ( config ) do
26
+ profile_fields = [ "uid" , "first_name" , "last_name" ,
27
+ "photo_200" , "screen_name" , "verified" ]
28
+
29
+ user_url_params = % {
30
+ "fields" => Enum . join ( profile_fields , "," ) ,
31
+ "v" => "5.69" ,
32
+ "https" => "1"
33
+ } |> Map . merge ( config [ :user_url_params ] || % { } )
34
+
35
+ [
36
+ site: "https://api.vk.com" ,
37
+ authorize_url: "https://oauth.vk.com/authorize" ,
38
+ token_url: "https://oauth.vk.com/access_token" ,
39
+ user_url: "/method/users.get" ,
40
+ authorization_params: [ scope: "email" ] ,
41
+ user_url_params: user_url_params
42
+ ]
43
+ |> Keyword . merge ( config )
44
+ |> Keyword . put ( :strategy , OAuth2.Strategy.AuthCode )
45
+ end
46
+
47
+ defp get_user ( { :ok , % { conn: conn , client: client } } , config ) do
48
+ user_url_params = config [ :user_url_params ] |> Map . put ( "access_token" , client . token . access_token )
49
+ user_url = config [ :user_url ] <> "?" <> URI . encode_query ( user_url_params )
50
+
51
+ OAuth2Helper . get_user ( { :ok , % { conn: conn , client: client } } , user_url )
52
+ end
53
+ defp get_user ( { :error , _ } = error , _config ) , do: error
54
+
55
+ defp get_response ( { :ok , % { client: client , user: % { "response" => [ user ] } } = resp } ) do
56
+ email = Map . get ( client . token . other_params , "email" )
57
+ user = Map . put_new ( user , "email" , email )
58
+
59
+ { :ok , Map . put ( resp , :user , user ) }
60
+ end
61
+ defp get_response ( { :ok , resp } ) , do: { :error , % { error: "Retrieved invalid response: #{ inspect resp . user } " } }
62
+ defp get_response ( resp ) , do: resp
63
+
64
+ defp normalize ( { :ok , % { conn: conn , client: client , user: user } } ) do
65
+ user = % { "uid" => user [ "id" ] |> to_string ,
66
+ "nickname" => user [ "screen_name" ] ,
67
+ "first_name" => user [ "first_name" ] ,
68
+ "last_name" => user [ "last_name" ] ,
69
+ "name" => [ user [ "first_name" ] , user [ "last_name" ] ] |> Enum . join ( " " ) ,
70
+ "email" => user [ "email" ] ,
71
+ "image" => user [ "photo_200" ] ,
72
+ "verified" => user [ "verified" ] > 0 }
73
+ |> Helpers . prune
74
+
75
+ { :ok , % { conn: conn , client: client , user: user } }
76
+ end
77
+ defp normalize ( { :error , _ } = error ) , do: error
78
+ end
0 commit comments